1

我正在编写一个使用 CMake 的库,并尝试按照此处的说明将 Abseil 链接到其中:

https://github.com/abseil/abseil-cpp/blob/master/CMake/README.md

我的CMakeLists.txt基本上包含:

add_library(MyLib SHARED src/mylib.cc)
add_subdirectory(third_party/abseil-cpp)
target_link_libraries(MyLib PRIVATE absl::base absl::strings absl::str_format)

现在,如果我编译我的库,我会收到以下错误:

/usr/bin/ld: third_party/abseil-cpp/absl/strings/libabsl_absl_str_format_internal.a(arg.cc.o): relocation R_X86_64_PC32 against symbol `_ZNKSt17basic_string_viewIcSt11char_traitsIcEE4sizeEv' can not be used when making a shared object; recompile with -fPIC

换句话说,CMake 编译 Abseil 时不使用与位置无关的代码。然后,我试着看看如果我将我的库改为静态库会发生什么。更改CMakeLists.txt

add_library(MyLib STATIC src/mylib.cc)
add_subdirectory(third_party/abseil-cpp)
target_link_libraries(MyLib PRIVATE absl::base absl::strings absl::str_format)

运行时出现以下错误cmake

CMake Error: install(EXPORT "MyLibTargets" ...) includes target "MyLib" which requires target "absl_base" that is not in the export set.
CMake Error: install(EXPORT "MyLibTargets" ...) includes target "MyLib" which requires target "absl_strings" that is not in the export set.
CMake Error: install(EXPORT "MyLibTargets" ...) includes target "MyLib" which requires target "absl_str_format" that is not in the export set.

我是 CMake 新手,但我还没有弄清楚如何解决这两个错误。您如何在 CMake 中传递指定依赖项应编译以定位独立代码?

4

1 回答 1

1

GitHub 上的这个线程

看起来您想按照@Mizux 之前的建议使用 CMAKE_POSITION_INDEPENDENT_CODE 。添加set(CMAKE_POSITION_INDEPENDENT_CODE TRUE)到您的 CMakeLists.txt 文件 [...]

这应该可以解决您在构建共享库时看到的任何问题,同时仍然静态地构建和链接 abseil 到您的库中。

于 2019-11-21T14:24:50.480 回答