如何解决target_link_libraries在target是静态库,目标链接是静态库的时候做什么
来自以下示例:
CMakeList.txt 文件:
include_directories(inc)
# Grab all the cpp and h files to be compile.
file(GLOB SOURCES
inc/*.h
inc/*.hpp
src/*.cpp
)
add_library(MyStaticLib STATIC ${SOURCES} )
target_link_libraries(MyStaticLib PUBLIC "${OPENCV_LIBS}/opencv_world410.lib" )
target_link_libraries(MyStaticLib PUBLIC "${OPENCV_LIBS}/opencv_world410d.lib" )
这是否创建了一个静态库?我以为您无法将静态库链接到 C++ 中的静态库?为什么这样做? 另外,这样做的最佳方法是什么?例如,如果我创建一个 API 是静态库,即 MyStaticLib 并且它依赖于 opencv 的静态库,那么在 CMake 中设置它的最佳方法是什么?
谢谢大家。 真挚地, 来自 Old-School 的 Frank。
解决方法
简而言之
当 target_link_libraries
应用于静态库时,它不会影响生成的库文件。但它以类似的方式影响目标,因为它会影响共享库的目标。
因此,您可以以相同的方式将 target_link_libraries
用于静态库和共享库。
详情
应用于静态 库时,target_link_libraries
不会立即影响该库的创建。也就是说,当静态库将被创建(作为文件)时,它不会存储该链接:
add_library(MyStaticLib STATIC ${SOURCES} )
target_link_libraries(MyStaticLib PUBLIC "${OPENCV_LIBS}/opencv_world410.lib")
# When file 'MyStaticLib.lib' will be created,# it will NOT be linked with 'opencv_world410.lib'.
(您可能知道,静态库不存储有关链接的任何信息,静态库只是目标文件的集合。)
但是,虽然带有静态库的文件不存储链接信息,但代表该静态库的 CMake 目标 将“知道链接”。这在很多情况下都很有用:
-
如果您在同一个项目中创建了可执行文件或共享库,并将其与静态库链接(使用
target_link_libraries
),该可执行文件实际上将与依赖库链接:add_executable(myExe ...) target_link_libraries(myExe PRIVATE MyStaticLib) # When file 'myExe.exe' will be created,it WILL be linked with 'opencv_world410.lib'
-
如果在同一个项目中创建另一个静态库,并将其与静态库链接,另一个静态库将“知道链接”与初始静态库和它的依赖。
add_library(MyStaticLibAnother STATIC ..) target_link_libraries(MyStaticLibAnother PUBLIC MyStaticLib) # "As if" following line is executed # target_link_libraries(MyStaticLibAnother PUBLIC "${OPENCV_LIBS}/opencv_world410.lib")
-
如果您安装库目标并使用命令
install(TARGETS ... EXPORT ...)
导出,则可以使用find_package
找到该库。并且find_package
将创建一个静态库目标,它将意识到链接与其所有依赖项:# [In main project] install(TARGETS MyStaticLib EXPORT MyProject) install(EXPORT MyProject NAMESPACE MyProject::)
# [In another project] find_package(MyProject REQUIRED) # It creates the target MyProject::MyStaticLib which is # "aware of linkage" with 'opencv_world410.lib'.
此外,如果您将静态库与目标(而不是纯文件)链接,并且该目标包含编译定义或其他适用于编译阶段的信息,则静态库将使用该编译信息编译。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。