来自以下示例:
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,它是一个静态Lib,即MyStaticLib,并且它依赖于opencv的静态Lib,那么在CMake中设置它的最佳方法是什么?
简而言之
当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'.
此外,如果将静态库链接到目标(而不是普通文件(,并且该目标包含适用于编译阶段的编译定义或其他信息,则将使用该编译信息编译静态库。