阿里云一键建站网站,sem和seo的关系,外卖网站开发,办一家建筑公司需要哪些岗位扒自网友文章 关于undefined reference这样的问题#xff0c;大家其实经常会遇到#xff0c;在此#xff0c;我以详细地示例给出常见错误的各种原因以及解决方法#xff0c;希望对初学者有所帮助。 1. 链接时缺失了相关目标文件#xff08;.o#xff09; 测试代码如下大家其实经常会遇到在此我以详细地示例给出常见错误的各种原因以及解决方法希望对初学者有所帮助。 1. 链接时缺失了相关目标文件.o 测试代码如下 然后编译。 gcc -c test.c gcc –c main.c 得到两个 .o 文件一个是 main.o一个是 test.o 然后我们链接 .o 得到可执行程序 gcc -o main main.o 这时你会发现报错了 main.o: In function main: main.c:(.text0x7): undefined reference to test collect2: ld returned 1 exit status 这就是最典型的undefined reference错误因为在链接时发现找不到某个函数的实现文件本例中test.o文件中包含了test()函数的实现所以如果按下面这种方式链接就没事了。 gcc -o main main.o test.o 【扩展】其实上面为了让大家更加清楚底层原因我把编译链接分开了下面这样编译也会报undefined reference错其实底层原因与上面是一样的。 gcc -o main main.c //缺少test()的实现文件 需要改成如下形式才能成功将test()函数的实现文件一起编译。 gcc -o main main.c test.c //ok,没问题了 2. 链接时缺少相关的库文件.a/.so 在此只举个静态库的例子假设源码如下。 先把test.c编译成静态库(.a)文件 gcc -c test.c ar -rc test.a test.o 至此我们得到了test.a文件。我们开始编译main.c gcc -c main.c 这时则生成了main.o文件然后我们再通过如下命令进行链接希望得到可执行程序。 gcc -o main main.o 你会发现编译器报错了 /tmp/ccCPA13l.o: In function main: main.c:(.text0x7): undefined reference to test collect2: ld returned 1 exit status 其根本原因也是找不到test()函数的实现文件由于该test()函数的实现在test.a这个静态库中的故在链接的时候需要在其后加入test.a这个库链接命令修改为如下形式即可。 gcc -o main main.o ./test.a //注./ 是给出了test.a的路径 【扩展】同样为了把问题说清楚上面我们把代码的编译链接分开了如果希望一次性生成可执行程序则可以对main.c和test.a执行如下命令。 gcc -o main main.c ./test.a //同样如果不加test.a也会报错 3. 链接的库文件中又使用了另一个库文件 这种问题比较隐蔽也是我最近遇到的与网上大家讨论的不同的问题举例说明如下首先还是看看测试代码。 从上图可以看出main.c调用了test.c的函数test.c中又调用了fun.c的函数。 首先我们先对fun.ctest.cmain.c进行编译生成 .o文件。 gcc -c func.c gcc -c test.c gcc -c main.c 然后将test.c和func.c各自打包成为静态库文件。 ar –rc func.a func.o ar –rc test.a test.o 这时我们准备将main.o链接为可执行程序由于我们的main.c中包含了对test()的调用因此应该在链接时将test.a作为我们的库文件链接命令如下。 gcc -o main main.o test.a 这时编译器仍然会报错如下 test.a(test.o): In function test: test.c:(.text0x13): undefined reference to func collect2: ld returned 1 exit status 就是说链接的时候发现我们的test.a调用了func()函数找不到对应的实现。由此我们发现原来我们还需要将test.a所引用到的库文件也加进来才能成功链接因此命令如下。 gcc -o main main.o test.a func.a ok这样就可以成功得到最终的程序了。同样如果我们的库或者程序中引用了第三方库如pthread.a则同样在链接的时候需要给出第三方库的路径和库文件否则就会得到undefined reference的错误。 4 多个库文件链接顺序问题 这种问题也非常的隐蔽不仔细研究你可能会感到非常地莫名其妙。我们依然回到第3小节所讨论的问题中在最后如果我们把链接的库的顺序换一下看看会发生什么结果 gcc -o main main.o func.a test.a 我们会得到如下报错. test.a(test.o): In function test: test.c:(.text0x13): undefined reference to func collect2: ld returned 1 exit status 因此我们需要注意在链接命令中给出所依赖的库时需要注意库之间的依赖顺序依赖其他库的库一定要放到被依赖库的前面这样才能真正避免undefined reference的错误完成编译链接。 5. 在c代码中链接C语言的库 如果你的库文件由c代码生成的则在c代码中链接库中的函数时也会碰到undefined reference的问题。下面举例说明。 首先编写c语言版库文件 编译打包为静态库test.a gcc -c test.c ar -rc test.a test.o 至此我们得到了test.a文件。下面我们开始编写c文件main.cpp 然后编译main.cpp生成可执行程序 g -o main main.cpp test.a 会发现报错 /tmp/ccJjiCoS.o: In function main: main.cpp:(.text0x7): undefined reference to test() collect2: ld returned 1 exit status 原因就是main.cpp为c代码调用了c语言库的函数因此链接的时候找不到解决方法即在main.cpp中把与c语言库test.a相关的头文件包含添加一个extern C的声明即可。例如修改后的main.cpp如下 g -o main main.cpp test.a 再编译会发现问题已经成功解决。转载于:https://www.cnblogs.com/azbane/p/9903104.html