首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >静态链接启用了PIC的库时出现链接器PIC错误

静态链接启用了PIC的库时出现链接器PIC错误
EN

Stack Overflow用户
提问于 2020-05-19 00:32:30
回答 1查看 218关注 0票数 2

我正在使用g++-9和CMake (在Xenial上,在Travis上)构建一个库(libproj),这样我就可以在Rust crate中静态地链接它。My build.rs使用以下配置设置和运行CMake:

代码语言:javascript
复制
cmake proj-7.0.1
-DBUILD_SHARED_LIBS=ON
-DBUILD_TESTING=OFF
-DCMAKE_BUILD_TYPE=Release
-DCMAKE_CXX_FLAGS="-std=c++11 -fPIC"
-DCMAKE_INSTALL_PREFIX=[path snipped]/out
-DCMAKE_C_FLAGS= -ffunction-sections -fdata-sections -fPIC -m64
-DCMAKE_C_COMPILER=/usr/bin/gcc-9
-DCMAKE_CXX_COMPILER=/usr/bin/g++-9
-DCMAKE_ASM_FLAGS= -ffunction-sections -fdata-sections -fPIC -m64
-DCMAKE_ASM_COMPILER=/usr/bin/gcc-9

Which builds and installs libproj successfully

然后我告诉cargo静态链接它:

代码语言:javascript
复制
cargo:root=[path snipped]/out
cargo:rustc-link-search=native=[path snipped]/out/lib
cargo:rustc-link-lib=static=proj

但是,链接步骤失败了,因为我不能在共享对象中使用重定位:

代码语言:javascript
复制
note: /usr/bin/ld: [path snipped]/out/lib/libproj.a(4D_api.cpp.o): relocation
R_X86_64_32 against `.rodata.str1.8' can not be used when making a
shared object; recompile with -fPIC`

[path snipped]/out/lib/libproj.a(4D_api.cpp.o): error adding symbols: Bad value
collect2: error: ld returned 1 exit status

我在这里做错了什么?我还尝试将libproj构建为静态库,方法是将BUILD_SHARED_LIBS设置为OFF,按照install instructions设置,但没有任何效果。

更新:

我已经设法为g++启用了PIC (默认情况下,它只为gcc启用)

代码语言:javascript
复制
running: "cmake" "-Wdev" "--debug-output" "[snipped]/proj-7.0.1" "-DCMAKE_CXX_FLAGS=-std=c++11" "-DCMAKE_CXX_FLAGS=-fPIC" "-DBUILD_SHARED_LIBS=OFF" "-DCMAKE_INSTALL_PREFIX=[snipped]/out" "-DCMAKE_C_FLAGS= -ffunction-sections -fdata-sections -fPIC -m64" "-DCMAKE_C_COMPILER=/usr/bin/gcc-9" "-DCMAKE_CXX_COMPILER=/usr/bin/g++-9" "-DCMAKE_ASM_FLAGS= -ffunction-sections -fdata-sections -fPIC -m64" "-DCMAKE_ASM_COMPILER=/usr/bin/gcc-9" "-DCMAKE_BUILD_TYPE=Debug" "-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON"

导致下面的g++-9调用,其中包括-fPIC

代码语言:javascript
复制
/usr/bin/g++-9  -DCURL_ENABLED -DMUTEX_pthread -DPROJ_LIB=\"/[snip]/proj\" -DTIFF_ENABLED -I/[snip]/src -I/[snip]/include -I/[snip]/src -I/usr/include/x86_64-linux-gnu  -fPIC -g -fvisibility=hidden   -Wall -Wextra -Wswitch -Wshadow -Wunused-parameter -Wmissing-declarations -Wformat -Wformat-security -std=c++11 -o CMakeFiles/proj.dir/aasincos.cpp.o -c /[snip]/proj/proj-7.0.1/src/aasincos.cpp

然而,我知道得到一个完全不同的错误(数千行),看起来我的静态库没有正确地链接到c++11 stdlib:

Error

undefined reference to std::allocator<char>::allocator()

更新2:

我已经设法从ld中删除了-nodefaultlibs标志。最新的g++调用:

代码语言:javascript
复制
/usr/bin/g++-9   -I/[snipped]/src -I/[snipped]/include -I/[snipped]/src -isystem /[snipped]/include -isystem /[snipped]/googletest  -fPIC -g -fvisibility=hidden   -Wall -Wextra -Wswitch -Wshadow -Wunused-parameter -Wmissing-declarations -Wformat -Wformat-security -pthread -std=c++11 -o CMakeFiles/proj_context_test.dir/proj_context_test.cpp.o -c /[snipped]/proj_context_test.cpp

我已经设法将lstdc++添加到链接器调用中:

代码语言:javascript
复制
"cc" "-Wl,--as-needed" "-Wl,-z,noexecstack" "-m64" "-L" "/[snip]/lib" "/home/travis/build/georust/proj-sys/target/debug/deps/proj_sys-95cbd73f2c3f0bde.20tasg77xuhsj5z6.rcgu.o" "/home/travis/build/georust/proj-sys/target/debug/deps/proj_sys-95cbd73f2c3f0bde.57y4784ihm3qw715.rcgu.o" "-o" "/[snip]/deps/proj_sys-95cbd73f2c3f0bde" "/home/travis/build/georust/proj-sys/target/debug/deps/proj_sys-95cbd73f2c3f0bde.3kiafs23968zh4mj.rcgu.o" "-Wl,--gc-sections" "-pie" "-Wl,-zrelro" "-Wl,-znow" "-L" "/home/travis/build/georust/proj-sys/target/debug/deps" "-L" "/home/travis/build/georust/proj-sys/target/debug/build/proj-sys-aff2ac9d43b77886/out/lib" "-L" "/home/travis/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "-lsqlite3" "-lcurl" "-ltiff" "-lstdc++" "-Wl,-Bstatic" "-Wl,--whole-archive" "-lproj" "-Wl,--no-whole-archive" [trimmed rlib details] "-Wl,--end-group" "/home/travis/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcompiler_builtins-2541f1e09df1c67d.rlib" "-Wl,-Bdynamic" "-ldl" "-lrt" "-lpthread" "-lgcc_s" "-lc" "-lm" "-lrt" "-lpthread" "-lutil" "-lutil"

undefined reference error仍然存在。

EN

回答 1

Stack Overflow用户

发布于 2020-05-21 20:03:15

正如我从您的示例中看到的,您在CMAKE_CXX_FLAGS两边有引号,而在CMAKE_C_FLAGS两边没有引号。看起来很奇怪。

我自己用cmake +你的标志和make VERBOSE=1构建了libgproj

我可以看到,没有使用fPICm64fdata-sections编译的C文件。我想,原因在CMAKE_C_FLAGS周围的引号中。我在Travis中看到了你的日志,还有来自cargocmake配置

代码语言:javascript
复制
"cmake" "/home/travis/build/georust/proj-sys/PROJSRC/proj/proj-7.0.1" "-DBUILD_SHARED_LIBS=ON" "-DBUILD_TESTING=OFF" "-DCMAKE_BUILD_TYPE=Release" "-DCMAKE_CXX_FLAGS=-std=c++11 -fPIC" "-DCMAKE_INSTALL_PREFIX=/home/travis/build/georust/proj-sys/target/debug/build/proj-sys-03a5fe6428bb060a/out" "-DCMAKE_C_FLAGS= -ffunction-sections -fdata-sections -fPIC -m64" "-DCMAKE_C_COMPILER=/usr/bin/gcc-9" "-DCMAKE_CXX_COMPILER=/usr/bin/g++-9" "-DCMAKE_ASM_FLAGS= -ffunction-sections -fdata-sections -fPIC -m64" "-DCMAKE_ASM_COMPILER=/usr/bin/gcc-9"

请注意,-DCMAKE_C_FLAGSCMAKE_CXX_FLAGS使用它们的值进行转义,而不是值本身。我想,这些选项变成了外壳:

代码语言:javascript
复制
cmake -DCMAKE_C_FLAGS= -ffunction-sections -fdata-sections -fPIC -m64 -DCVMAKE_CXX_FLAGS=-std=c++11 -fPIC

我试过这个命令,没有引号,cmake只是忽略了未知的选项。所以它不会失败。

如果可以的话,我建议你将cmake选项-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON添加到cmake配置中,或者将VERBOSE=1添加到make选项中,然后你就可以在Travis中看到传递给gcc的真实编译选项了。

你会看到类似这样的东西:

代码语言:javascript
复制
[ 19%] Building C object src/CMakeFiles/proj.dir/wkt1_generated_parser.c.o
cd [some path]/PROJ/cmake_build/src && /usr/bin/cc -DCURL_ENABLED -DMUTEX_pthread 
-DPROJ_LIB=\"/usr/local/share/proj\" -DTIFF_ENABLED -I[some path]PROJ/src -I[some 
path]/PROJ/include -I[some path]/PROJ/cmake_build/src  -O3 -DNDEBUG - 
fvisibility=hidden   -Wall -Wextra -Wswitch -Wshadow -Wunused-parameter -Wmissing- 
declarations -Wformat -Wformat-security -Wmissing-prototypes -std=c99 -o 
CMakeFiles/proj.dir/wkt1_generated_parser.c.o   -c [some 
path]/PROJ/src/wkt1_generated_parser.c

结论:

  1. 您可以尝试添加详细信息以查看实际的编译选项。
  2. 如果在第一步之后有必要,您可以尝试正确地转义选项。

我还想指出的是,在我的测试中,SHARED_BUILD_LIBS=ON禁止构建您想要链接的静态库。当我将共享库构建设置选项设置为OFF时,构建了静态库。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61874411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档