我建立使用克++库(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
通过设置静态库libproj
至BUILD_SHARED_LIBS
为每OFF
,但一直没有任何效果。
我可以从你的例子中看到,你身边的配额install instructions,并没有配额周围CMAKE_CXX_FLAGS
。看起来很奇怪。
我已经给自己建CMAKE_C_FLAGS
与libgproj
与您的标志,然后用cmake
I可以看到,编译的C-文件而不make VERBOSE=1
,fPIC
和m64
。我想,在配额周围data-sections
这项事业。我有看到你的日志中特拉维斯,并没有配置CMAKE_C_FLAGS
从cmake
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=ON
到VERBOSE=1
选项,如果可以的话,然后你就可以在传递给GCC特拉维斯真正的编译选项见。
你会看到somethig这样的:
make
结论:
你可以尝试添加冗长看到真正的编译选项
你可以尝试适当地逃避的选择,如果它是第一个步骤之后必要的。
我也想说明,即[ 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
,静态库建成。