c++ 当目标是一个静态库,而目标链接也是一个静态库时,'target_link_libraries'做什么?

px9o7tmv  于 2022-11-27  发布在  其他
关注(0)|答案(1)|浏览(123)

从以下示例中:
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中设置它的最好方法是什么?

xuo3flqw

xuo3flqw1#

简而言之
target_link_libraries应用于静态库时,它不会影响结果库文件。但是它会以类似的方式影响目标,就像它会影响共享库的目标一样。
因此,您可以以相同的方式将target_link_libraries用于静态库和共享库。

详细信息

当应用于static库时,target_link_libraries不会立即影响该库的创建。也就是说,当静态库被创建(作为file)时,它不会存储该链接:

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'.

(As您可能知道,静态库不存储任何有关链接的信息,静态库只是对象文件的集合。)
但是,尽管带有静态库的文件不存储链接信息,但代表该静态库的CMaketarget将“知道链接"。这在许多情况下都很有用:
1.如果在同一个项目中创建一个可执行文件或一个共享库,并将其与静态库链接(使用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'

1.如果在同一个项目中创建另一个静态库,并将其与静态库链接,则另一个静态库将“知道与初始静态库及其依赖项的链接”。

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")

1.如果你安装你的库目标并使用命令install(TARGETS ... EXPORT ...)导出它,那么库可以用find_package找到。并且find_package将创建一个静态库目标,它将知道链接及其所有依赖项:
第一个
此外,如果您将静态库与目标(而不是普通文件)链接,并且该目标包含编译定义或其他适用于编译阶段的信息,则将使用该编译信息编译静态库。

相关问题