Tag: 链接

是否可以在DLL中导出C链接的C ++成员方法?

在cpp文件中考虑这个: struct someStruct{ public: extern “C” __declspec(dllexport) int sumup(); } someStruct; extern “C” __declspec(dllexport) int someStruct::sumup() { return 0; } 这不编译: error: expected unqualified-id before string constant是否无法使用C链接导出C ++成员方法?

未定义的引用’_ *’链接器错误

我在编译/链接以下C代码时遇到问题。 链接器抛出的错误如下所示: pso.o:pso.c:(.text+0x41): undefined reference to ‘_ps’ … pso.o:pso.c:(.text+0x93): more undefined references to ‘_ps’ follow 这是我第一次为gcc编写C代码,所以我不确定如何解决这个问题。 我假设因为结构PS定义了我的头文件,它不知何故没有链接到pso.c. 但是,我确实在该源文件的顶部使用了#include“ps.h”语句。 我已经在下面包含了相关的源文件和头文件,以及我正在使用的make文件。 编写可链接的C代码是否缺少一个基本概念? 谢谢! 哦,这是一个粒子群优化器,如果你想知道:) main.c文件: #define MAIN #include #include #include #include “ps.h” int main(int argc, char *argv[]) { int c; double test; int test_int; srand(time(NULL)); printf(“starting pso\n”); pso(); printf(“finished pso\n”); return(0); } 有问题的文件,pso.c: #include #include “ps.h” double […]

错误LNK2019:多项目解决方案中未解析的外部符号

我有一个包含多个项目的visual studio解决方案。 其中之一,“MyProject”是一个静态库(.lib)。 该项目与许多其他课程一样,有两个class级“A”和“B”。 啊: #pragma once class A { public: void foo(); }; A.cpp: #include Ah void A::foo(){ //do something } BH: #pragma once class B { public: void bar(); }; B.cpp: #include Bh #include Ah void B::bar(){ A a; a.foo(); } 没有编译错误我得到链接错误: OtherProject.lib(B.obj):错误LNK2019:未解析的外部符号“public:void __thiscall A :: foo(void)”(?foo @ A @@ QAE_NXZ)在函数“public:void __thiscall B […]

GTK + gcc:链接时对所有gtk函数的未定义引用

我正在用GTK +编写一个接口,用于使用XMPP协议进行聊天。 当我编译它时,我的代码运行正常: gcc login_gtk.c `pkg-config –cflags –libs gtk+-3.0` 但是因为我将我的文件添加到我的项目中,并且我正在使用Makefile,所以它不再编译。 我想问题来自我的Makefile。 编译器错误: gcc -o -W -Wall -Wextra -Werror -g -I./Includes/. -pthread -I/usr/include/gtk-3.0 -I/usr/include/atk-1.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/freetype2 -I/usr/include/pixman-1 -I/usr/include/libpng12 -lgtk-3 -lgdk-3 -latk-1.0 -lgio-2.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo-gobject -lpango-1.0 -lcairo -lgobject-2.0 -lglib-2.0 -c -o Sources/login_gtk.o Sources/login_gtk.c gcc -o -W -Wall -Wextra -Werror -g […]

无法链接到fftw3库

我正在编译测试程序以测试fftw3(ver3.3.4)。 由于它没有安装root previlidge,我使用的命令是: gcc -lm -L/home/my_name/opt/fftw-3.3.4/lib/ -I/home/my_name/opt/fftw-3.3.4/include/ fftwtest.c 安装库的位置 /home/my_name/opt/fftw-3.3.4/ 我的代码是fftw3网站上的第一个教程: #include #include int main(){ int n = 10; fftw_complex *in, *out; fftw_plan p; in = (fftw_complex*) fftw_malloc(n*sizeof(fftw_complex)); out = (fftw_complex*) fftw_malloc(n*sizeof(fftw_complex)); p = fftw_plan_dft_1d(n, in, out, FFTW_FORWARD, FFTW_ESTIMATE); fftw_execute(p); /* repeat as needed */ fftw_destroy_plan(p); fftw_free(in); fftw_free(out); return 0; } 当我编译程序时它会返回以下错误: /tmp/ccFsDL1n.o: In function […]

链接器脚本 – 将一个部分放在内存区域的末尾

我已经广泛搜索了如何做到这一点并未能得出答案。 我的内存布局如下: Fake Address | Section 0 | text 7 | relocate 15 | bss 23 | stack 在堆栈的末尾我放置堆。 它正在成长,堆栈是我正在使用的ARM芯片的完全下降堆栈。 现在,我想要做的是放置一个部分,让我们称之为.persist ,进入我的ram内存。 我希望它驻留在RAM的最后,我想将其编程到我的链接器脚本中。 但是,此.persist部分的大小不是由我定义的,而是由编译器根据它包含的符号计算的。 到目前为止,我还没有想出一个好办法。 因为我知道RAM起始地址和SIZE,如果我知道部分大小,那么计算部分需要去的位置是微不足道的。 但是,根据GNU链接器文档(第74页),它似乎是: SIZEOF(section)如果已分配该部分,则返回指定部分的大小(以字节为单位)。 如果在评估此部分时尚未分配该部分,则链接器将报告错误。 所以我无法计算出链接器脚本中该部分的大小(因为我想在放置它/分配之前计算大小)。 有谁知道这样做的好方法?

“未定义的符号_memset”

我问了一个类似的问题,但我有一些更新让我很困惑。 基本上,我想用链接器链接许多目标文件,如下所示: /usr/ccs/bin/ld -oq -e start_master -dn -z defs -M ../../../mapfile.q {list of object files} 我收到以下错误: Undefined first referenced symbol in file _memset reconf.o 有趣的是,memset没有在reconf.c中引用,我也对整个目录进行了grep,但是在任何其他文件中也没有引用_memset。 因此,我想知道为什么我从链接器收到此错误消息,尽管在我的源代码中实际上没有使用_memset。 有人知道这里会发生什么吗? 非常感谢,这个错误正在驱使我们精神上! 编辑: 我尝试将路径添加到memset库并将其与-lc链接并以详细模式运行: /usr/ccs/bin/ld -oq -e start_master -dn -z defs -z verbose -L/usr/lib -M ../../../mapfile.q {list of object files} -lc 然后我得到以下错误:ld:致命:library -lc:not found ld:fatal:文件处理错误。 没有输出写入q 虽然libc.so显然在/ usr / […]

传递给C库的函数指针的C链接

我的情况非常简单:我希望我的C ++程序能够处理Unix信号。 为此,glibc在signal.h中提供了一个名为sigaction的函数,它希望接收一个函数指针作为它的第二个参数。 extern “C” { void uponSignal(int); } void uponSignal(int) { // set some flag to quit the program } static void installSignalHandler() { // initialize the signal handler static struct sigaction sighandler; memset( &sighandler, 0, sizeof(struct sigaction) ); sighandler.sa_handler = uponSignal; // install it sigaction( SIGINT, &sighandler, nullptr ); } 我的问题是: extern “C”链接说明符是否必要? […]

确定C可执行文件名称

当我们编译C程序时,输出存储在a.out中。 我们如何将编译后的输出重定向到另一个文件?

c&c ++默认全局变量链接,多个声明和定义问题

例如: code1.c / .cpp int a; // … and so on code2.c / .cpp int a; int main(void) { return 0; } 去编译: $gcc code1.c code2.c # this is fine $ $g++ code1.cpp code2.cpp # this is dead /tmp/ccLY66HQ.o:(.bss+0x0): multiple definition of `a’ /tmp/ccnIOmPC.o:(.bss+0x0): first defined here collect2: ld returned 1 exit status C&C ++之间是否存在全局变量链接差异?