target是静态库而taarget link是静态库时target_link_libraries做什么
What does target_link_libraries do when the target is a static library and the taarget link is a static library
来自以下示例:
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" )
这会创建一个静态库吗?我以为你不能 link 静态库到 C++ 中的静态库?为什么这行得通?
另外,最好的方法是什么?例如,如果我创建一个 API 这是一个静态库,即 MyStaticLib 并且它依赖于 opencv 的静态库,那么在 CMake 中设置它的最佳方法是什么?
谢谢大家。
真挚地,
来自 Old-School 的 Frank。
简而言之
当target_link_libraries
应用于静态库时,它不会影响结果库file。但它以类似的方式影响 target,因为它会影响共享库的目标。
因此,您可以以相同的方式对静态库和共享库使用 target_link_libraries
。
详情
当应用于 static 库时,target_link_libraries
不会立即影响此库的创建。也就是说,当创建静态库时(如 file),它不会存储 linkage:
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'.
(您可能知道,静态库不存储有关 linkage 的任何信息,静态库只是目标文件的集合。)
但是,虽然带有静态库的文件不存储 linkage 信息,但表示该静态库的 CMake target 将是“知道link年龄”。这在很多情况下都很有用:
如果您在同一个项目中创建了一个 可执行文件 或一个 共享库 ,并且 link它与静态库(使用 target_link_libraries
),该可执行文件实际上将 link 与依赖库编辑:
add_executable(myExe ...)
target_link_libraries(myExe PRIVATE MyStaticLib)
# When file 'myExe.exe' will be created, it WILL be linked with 'opencv_world410.lib'
如果在同一个项目中创建另一个静态库,并且link它与静态库一起创建,另一个静态库将是“了解 linkage" 以及初始静态库及其依赖项。
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
将创建一个静态库目标,它将 意识到 linkage 及其所有依赖项:
# [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'.
此外,如果您 link 一个带有 目标 的静态库(不是普通文件),并且该目标包含编译定义或其他信息,适用于在编译阶段,静态库将使用该编译信息编译。
来自以下示例:
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" )
这会创建一个静态库吗?我以为你不能 link 静态库到 C++ 中的静态库?为什么这行得通? 另外,最好的方法是什么?例如,如果我创建一个 API 这是一个静态库,即 MyStaticLib 并且它依赖于 opencv 的静态库,那么在 CMake 中设置它的最佳方法是什么?
谢谢大家。 真挚地, 来自 Old-School 的 Frank。
简而言之
当target_link_libraries
应用于静态库时,它不会影响结果库file。但它以类似的方式影响 target,因为它会影响共享库的目标。
因此,您可以以相同的方式对静态库和共享库使用 target_link_libraries
。
详情
当应用于 static 库时,target_link_libraries
不会立即影响此库的创建。也就是说,当创建静态库时(如 file),它不会存储 linkage:
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'.
(您可能知道,静态库不存储有关 linkage 的任何信息,静态库只是目标文件的集合。)
但是,虽然带有静态库的文件不存储 linkage 信息,但表示该静态库的 CMake target 将是“知道link年龄”。这在很多情况下都很有用:
如果您在同一个项目中创建了一个 可执行文件 或一个 共享库 ,并且 link它与静态库(使用
target_link_libraries
),该可执行文件实际上将 link 与依赖库编辑:add_executable(myExe ...) target_link_libraries(myExe PRIVATE MyStaticLib) # When file 'myExe.exe' will be created, it WILL be linked with 'opencv_world410.lib'
如果在同一个项目中创建另一个静态库,并且link它与静态库一起创建,另一个静态库将是“了解 linkage" 以及初始静态库及其依赖项。
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
将创建一个静态库目标,它将 意识到 linkage 及其所有依赖项:# [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'.
此外,如果您 link 一个带有 目标 的静态库(不是普通文件),并且该目标包含编译定义或其他信息,适用于在编译阶段,静态库将使用该编译信息编译。