如何静态 link PROJ 到 pybind11

How to statically link PROJ to pybind11

我有兴趣将 PROJ 静态链接到使用 pybind11 创建的库。
但是,cmake 出错了。

为什么会出现此错误,我该如何解决?

我的CMakeLists.txt是这个

cmake_minimum_required(VERSION 3.4)
project(myearth LANGUAGES CXX)

add_subdirectory(pybind11)
pybind11_add_module(myearth MyEarth.cpp)

include_directories(${CMAKE_SOURCE_DIR}/PROJ/include)
add_library(proj4 STATIC IMPORTED)
set_target_properties(proj4 PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/PROJ/lib/libproj.a)

target_link_libraries(myearth PRIVATE proj4)

CMake 错误。
我认为 fPIC 选项适用于共享库。所以,libproj.a 不需要这个选项,因为这是静态库。

(venv) ~/Projects/LinkLibTest/MySample/build$ make
[ 50%] Building CXX object CMakeFiles/myearth.dir/MyEarth.cpp.o
[100%] Linking CXX shared module myearth.cpython-36m-x86_64-linux-gnu.so
/usr/bin/ld: ../PROJ/lib/libproj.a(proj_4D_api.o): relocation R_X86_64_PC32 against symbol `pj_errno' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: bad value
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/myearth.dir/build.make:98: myearth.cpython-36m-x86_64-linux-gnu.so] Error 1
make[1]: *** [CMakeFiles/Makefile2:100: CMakeFiles/myearth.dir/all] Error 2
make: *** [Makefile:91: all] Error 2
(venv) ~/Projects/LinkLibTest/MySample/build$ 

我通过以下命令创建了 libproj.a。

$ ./configure --prefix=/output --disable-shared
$ sudo make
$ sudo make install

谢谢。

共享库必须有与位置无关的代码,但你的 PROJ 版本是在没有它的情况下构建的;你将不得不用 PIC 重建 PROJ。

$ ./configure --prefix=/output --with-pic