Cmake:链接到静态内部库而不导出它
Cmake: linking to static internal library without exporting it
我有一个具有此结构的项目:
/path/to/my/project
├── CMakeLists.txt
├── internal-libs
│ ├── internal-lib1
├── libs
│ ├── lib1
│ ├── lib2
lib1
是一个静态库。
lib2
是一个静态库。
internal-lib1
是一个静态库。
静态链接到 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。我的目标包括所有是私人的。我不明白为什么INTERFACE_LINK_LIBRARIES
填充了条目以及LINK_ONLY的含义。
p.s. 实际上 lib1 和 lib2 应该是共享库,但我什至无法让静态版本工作,所以为了简单起见,我在这里描述可导出库的静态情况。
对于静态库lib1
和lib2
,CMake 命令
target_link_libraries(lib2 PRIVATE lib1)
并不意味着库lib1
在链接时lib2
复制到库。PRIVATE
关键字仅在另一个库链接到lib2
时lib1
影响库的传递使用要求。
若要让 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>
在这种情况下,无需将lib1
链接到lib2
target_link_libraries
.
一种选择是创建对象库而不是静态库:
add_library(foo OBJECT foo.cpp)
add_executable(baz $<TARGET_OBJECTS:foo> baz.cpp)
您可以在此处找到有关此功能的更多文档:https://cgold.readthedocs.io/en/latest/rejected/object-libraries.html
- 内联函数中具有内部链接的全局变量
- C++:具有内部链接的正向声明常量
- 具有命名空间范围的名称的 C++ 内部链接
- 为什么函数 f4 的名称具有内部链接,而不是 C 语言链接?
- 为什么在匿名名称空间中定义的模板时,为什么内部链接错误
- C++构造函数具有内部链接,但未定义 [-Wundefined-internal]
- C 无需使用匿名名称空间即可实现内部链接
- 内联是否决定内部链接?
- ODR和内部链接
- 为什么内部链接的名称会出现在我的目标文件的符号表中?
- C 标准:DO命名空间constexpr变量具有内部链接
- 通过来自另一个翻译单元的指针调用具有内部链接的函数
- 如何使朋友函数具有内部链接
- 类使用全局外部常量变量,该变量通过内部链接定义
- char* 具有内部链接,因此它不能不是非类型模板参数
- C++中const的内部链接,但我得到了重复的符号
- 非成员函数模板何时具有内部链接
- 我是否应该始终将我的全局函数与内部链接
- 内联命名空间变量有内部链接吗?如果没有,为什么下面的代码有效
- 使用comsup.lib时出现内部链接器错误