- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在 Google 上找不到直接的答案,而且由于我已经很长时间没有在 Linux 上做过任何事情,所以希望能在这里找到帮助。构建共享对象时,我在 Ubuntu 上遇到链接错误。链接器告诉我应该使用 -fPIC
重新编译,即使我已经为所有源文件设置了 -fPIC
。 make
的输出:
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/
使用 Qt 时,CMake 会自动将 -fPIC 标志添加到编译选项。我想使用 -fpic,所以我检查了所有 Cmake 变量并将 -fPIC 替换为 -fpic。 cmake_minimum_req
环境:Ubuntu 16.04 在我的实验中,我运行了以下命令: gcc -c 1.c gcc -c -fPIC 2.c gcc -shared 1.o 2.o -o libmyxxx.so 我需要公
我已经阅读了 gcc 手册页,但我仍然无法理解 -fpic 和 -fPIC 之间的区别。有人可以用非常简单明了的方式解释一下吗? 相关问题: What does -fPIC mean when bui
海湾合作委员会错误: relocation R_X86_64_32S against `ebx' can not be used when making a shared object; recomp
我已经下载了一些我想从源代码编译的 C++。从命令行运行 cmake ../src 和 make 后,在构建目录中,出现以下错误: /usr/bin/ld: /usr/local/lib/libBul
我在 Google 上找不到直接的答案,而且由于我已经很长时间没有在 Linux 上做过任何事情,所以希望能在这里找到帮助。构建共享对象时,我在 Ubuntu 上遇到链接错误。链接器告诉我应该使用 -
我目前正在 cmake 环境中构建共享库 (lib1.so)。lib1.so 依赖于外部静态库 libLASlib.a(如有必要,我可以重新编译)。到目前为止,一切都在 Windows 上运行良好,但
我的应用程序需要在运行时加载一个或多个算法,为此我使用 .so。问题是这些库除了我的应用程序之外没有被任何其他进程使用,所以不需要与其他人共享 .text 部分。 .so 的某些部分来 self 预先
我正在尝试使用 luarocks 安装 numlua: luarocks make numlua-0.3-1.rockspec 但出现以下错误: /usr/bin/ld: numlua.o: relo
即使我可能不打算将生成的可重定位目标文件链接到共享库中,始终使用 -fPIC 进行编译是否有任何危害? 最佳答案 好吧,总是使用 -fPIC 进行编译会产生更臃肿和更慢的代码。 差异在 x64 目标上
我想检查共享库是否使用 -fPIC 标志编译。有哪些可能的方法(在 Linux 上,x86_64)检查这个? -fPIC 是否隐含(从而使检查变得多余?) 最佳答案 是的,GCC 不允许您在没有 -f
我知道 -fPIC 是共享库所必需的,并且知道为什么。 但是,我对这个问题不是很清楚: -fPIC 不应在构建可执行文件或静态库期间使用吗? 最佳答案 Should -fPIC never be us
我有 MPICH 3.0.4安装在我的机器上(Ubuntu 12.04)。我正在尝试安装一个名为 Qthreads 的库我之前使用过并成功安装过它(除了安装了 MPICH2 包)。配置工作正常: ./
我正在构建一个共享库。我只需要一个函数就可以公开。 共享库由几个目标文件和几个静态库构建而成。链接器提示一切都应该用 -fPIC 构建.所有目标文件和大多数静态库都是在没有这个选项的情况下构建的。 这
-fpic 标志有什么作用? 我想安装一个库( OpenSFM ),据说它需要使用 -fPIC 编译标志构建和安装 Ceres Solver。 问题是我已经安装了没有 -fPIC 标志的 Ceres
我想将目标文件和静态库组合成一个共享库,但是静态库不能暴露,它只在进入共享库的目标文件中引用。我认为在这种情况下,我不需要使用 -fPIC 编译静态库,但我不知道如何告诉链接器我不会使用静态库中的符号
今天,当尝试使用 mongodb c++ 客户端构建我的 so lib 项目时,出现错误: /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/4.8/../../.
我正在为一个类编写一些 C 代码,但我遇到了需要在 make 文件中完成的编译器问题,当它运行时它总是给出错误 usr/bin/ld: main.o: 重定位 R_X86_64_32S 对符号“被积函
在centos中./configure asterisk后我输入make命令但是出现了以下错误 /usr/bin/ld:/usr/local/lib/liblua.a(lapi.o): 创建共享对象时
我正在尝试在 linux 中创建一个共享库,但在尝试编译时出现以下错误: relocation R_X86_64_32S against `.rodata' can not be used when
我是一名优秀的程序员,十分优秀!