我有一个具有这种结构的项目:
/path/to/my/project
├── CMakeLists.txt
├── internal-libs
│ ├── internal-lib1
├── libs
│ ├── lib1
│ ├── lib2
lib1
是一个静态库。
lib2
是一个静态库。
internal-lib1
是一个静态库。
lib2 静态链接到 lib2 和 internal-lib1。 lib1
和 lib2
将被导出,但 internal-lib1
将被留下。对于链接,我有:
target_link_libraries(lib2 PRIVATE internal-lib1)
target_link_libraries(lib2 PRIVATE lib1)
我的理解是,因为我是静态和私密地链接,所有关于 internal-lib1 的信息都将包含在 lib2 中,我不必将 internal-lib1 导出到外部世界。
但是,当我尝试在客户端程序中使用它时,出现错误:
/usr/bin/ld cannot find -llib-internal1
collect2: error: ld returned 1 exit status
在我生成的导出配置文件中,我有:
# Create imported target lib2
add_library(lib2 STATIC IMPORTED)
set_target_properties(lib2 PROPERTIES
INTERFACE_LINK_LIBRARIES "$<LINK_ONLY:lib1>;**$<LINK_ONLY:internal-lib1>**"
)
# Create imported target lib1
add_library(lib1 STATIC IMPORTED)
是我误解了静态链接还是我的设置有问题?我正在使用 cmake 3.2.2。我的所有目标包括都是私有(private)的。我不明白为什么 INTERFACE_LINK_LIBRARIES
中填充了条目以及 LINK_ONLY 的含义。
附注实际上 lib1 和 lib2 应该是共享库,但我什至无法让静态版本工作,所以为了简单起见,我在这里描述可导出库的静态情况。
最佳答案
对于静态库 lib1
和 lib2
,CMake 命令
target_link_libraries(lib2 PRIVATE lib1)
并不意味着库 lib1
在链接时被复制到库 lib2
。 PRIVATE
关键字只影响 transitive usage requirements库 lib1
当另一个库链接到 lib2
时。
要让 CMake 在链接时将 lib1
合并到 lib2
中,请使用 libtool
和 POST_BUILD
操作:
add_custom_command(TARGET lib2 POST_BUILD
COMMAND /usr/bin/libtool -static -o $<TARGET_FILE:lib2>
$<TARGET_FILE:lib2> $<TARGET_FILE:lib1>
在这种情况下,无需使用 target_link_libraries
将 lib1
链接到 lib2
。
关于c++ - Cmake:链接到静态内部库而不导出它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36181626/