c++ - 关于 -fPIC 的链接错误,即使所有源代码都是使用 -fPIC 编译的

标签 c++ gcc ld

我在 Google 上找不到直接的答案,而且由于我已经很长时间没有在 Linux 上做过任何事情,所以希望能在这里找到帮助。构建共享对象时,我在 Ubuntu 上遇到链接错误。链接器告诉我应该使用 -fPIC 重新编译,即使我已经为所有源文件设置了 -fPICmake 的输出:

mkdir -p ../_Bin/Debug/HttpClientApi
g++ -fPIC -pedantic -Wall -Wextra -std=c++11 -c CentralServerClient.cpp -o ../_Bin/Debug/HttpClientApi/CentralServerClient.o
CentralServerClient.cpp:4:80: warning: unused parameter ‘pEventListener’ [-Wunused-parameter]
 void CCentralServerClient::AddEventListener(ICentralServerClientEventListener* pEventListener)
                                                                            ^
CentralServerClient.cpp:29:83: warning: unused parameter ‘pEventListener’ [-Wunused-parameter]
 void CCentralServerClient::RemoveEventListener(ICentralServerClientEventListener* pEventListener)
                                                                               ^
g++ -fPIC -pedantic -Wall -Wextra -std=c++11 -c HttpRequest.cpp -o ../_Bin/Debug/HttpClientApi/HttpRequest.o
g++ -fPIC -pedantic -Wall -Wextra -std=c++11 -c HttpResponse.cpp -o ../_Bin/Debug/HttpClientApi/HttpResponse.o
g++ -fPIC -pedantic -Wall -Wextra -std=c++11 -c IOService.cpp -o ../_Bin/Debug/HttpClientApi/IOService.o
g++ -Wl,-shared -Wl,-v -Wl,-g -o ../_Bin/Debug/HttpClientApi.so ../_Bin/Debug/HttpClientApi/CentralServerClient.o ../_Bin/Debug/HttpClientApi/HttpRequest.o ../_Bin/Debug/HttpClientApi/HttpResponse.o ../_Bin/Debug/HttpClientApi/IOService.o
collect2 version 4.9.2
/usr/bin/ld -plugin /usr/lib/gcc/x86_64-linux-gnu/4.9/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/4.9/lto-wrapper -plugin-opt=-fresolution=/tmp/ccZ9RMHe.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o ../_Bin/Debug/HttpClientApi.so /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.9/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/4.9 -L/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.9/../../.. -shared -v -g ../_Bin/Debug/HttpClientApi/CentralServerClient.o ../_Bin/Debug/HttpClientApi/HttpRequest.o ../_Bin/Debug/HttpClientApi/HttpResponse.o ../_Bin/Debug/HttpClientApi/IOService.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/4.9/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu/crtn.o
GNU ld (GNU Binutils for Ubuntu) 2.25
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu/crt1.o: relocation R_X86_64_32S against `__libc_csu_fini' can not be used when making a shared object; recompile with -fPIC
/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu/crt1.o: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
Makefile:15: recipe for target '../_Bin/Debug/HttpClientApi.so' failed
make: *** [../_Bin/Debug/HttpClientApi.so] Error 1

gcc 是 gcc 版本 4.9.2 (Ubuntu 4.9.2-10ubuntu13)

感谢任何帮助。

最佳答案

不是给 g++ -Wl,-shared 你应该给它-shared。原因是 g++ 需要知道使用哪个 crt1.o - 一个适合共享库(使用 -fPIC 编译,scrt1.o)或一个不适合。

当您将 -shared 提供给 g++ 时,它知道使用 scrt1.o。但是当你传递 `-Wl,-shared' 时,g++ 不知道你正在构建共享库 - 它“认为”你正在构建一个普通的可执行文件(链接器确实知道发生了什么)并要求链接器与 crt1 链接.o.链接器拒绝,你有一个错误。

关于c++ - 关于 -fPIC 的链接错误,即使所有源代码都是使用 -fPIC 编译的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36070158/

相关文章:

c++ - 在使用 __interface 关键字时,如何使编译器为定义方法体的类发出错误?

c++ - 委托(delegate)构造函数抛出时是否会自动回收内存?

linux - Cimg 链接 eclipse 错误

c++ - 如何将应用程序与静态库链接+为什么这不起作用

ios - bolt Apple Mach-O 链接器错误

C++ for循环输出一个数组与多个数组不同的结果

c++ - 定义 static constexpr auto 类变量

c++ - 以函数作为模板参数的偏特化拒绝

linux - 链接器找不到符号,但已读取库且存在符号

linux - ld 找不到现有的库