连接子PIC错误启用

问题描述 投票:0回答:1

我建立使用克++库(libproj) - 9和CMake的(上Xenial,上特拉维斯),所以我可以静态锈色箱它链接。我的build.rs设置和运行的CMake具有以下配置:

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

I然后告诉货物静态链接它:

libproj

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

cargo:root=[path snipped]/out
cargo:rustc-link-search=native=[path snipped]/out/lib
cargo:rustc-link-lib=static=proj

我在这里做错了什么?我也试图建立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 通过设置静态库libprojBUILD_SHARED_LIBS为每OFF,但一直没有任何效果。

c++ cmake rust g++
1个回答
0
投票

我可以从你的例子中看到,你身边的配额install instructions,并没有配额周围CMAKE_CXX_FLAGS。看起来很奇怪。

我已经给自己建CMAKE_C_FLAGSlibgproj与您的标志,然后用cmake

I可以看到,编译的C-文件而不make VERBOSE=1fPICm64。我想,在配额周围data-sections这项事业。我有看到你的日志中特拉维斯,并没有配置CMAKE_C_FLAGScmake

cargo

注,即"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_FLAGS与它们的值逃脱,而不是值。我想,这个选择成为了壳:

CMAKE_CXX_FLAGS

我试图这样的命令,而无需配额和CMake的只是忽略未知的选项。因此它不会失败。

我建议你添加cmake的选项cmake -DCMAKE_C_FLAGS= -ffunction-sections -fdata-sections -fPIC -m64 -DCVMAKE_CXX_FLAGS=-std=c++11 -fPIC 向CMake配置或-DCMAKE_VERBOSE_MAKEFILE:BOOL=ONVERBOSE=1选项,如果可以的话,然后你就可以在传递给GCC特拉维斯真正的编译选项见。

你会看到somethig这样的:

make

结论:

  1. 你可以尝试添加冗长看到真正的编译选项

  2. 你可以尝试适当地逃避的选择,如果它是第一个步骤之后必要的。

我也想说明,即[ 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 在我的测试者禁用建立静态库,要链接。当我关掉共享库构建设置选项以SHARED_BUILD_LIBS=ON,静态库建成。

© www.soinside.com 2019 - 2024. All rights reserved.