target_link_libraries的用法
首先,我们来复习一下 target_link_libraries
关键字的用法:
在CMake中,target_link_libraries
函数用于将一个目标(例如可执行文件、库)与其他库进行链接。当不明确指定链接类型(public、private 或 interface)时,CMake 默认使用 PRIVATE
链接类型。
这意味着,如果在 target_link_libraries
中不写 PUBLIC
、PRIVATE
或 INTERFACE
,那么所有链接的库都将被视为 PRIVATE
。这意味着链接的库将只会影响当前目标,而不会传递到依赖于当前目标的其他目标。这通常是最常见的用法,因为通常希望链接的库不会影响其他依赖项。
要明确链接类型的区别:
PUBLIC
表示链接库不仅会应用于当前目标,还会传递给依赖于当前目标的其他目标。PRIVATE
表示链接库仅应用于当前目标。INTERFACE
表示链接库仅适用于依赖于当前目标的其他目标,而不适用于当前目标本身。
add_library(MyLibrary STATIC my_library.cpp)
target_link_libraries(MyLibrary PUBLIC SomePublicLibrary PRIVATE SomePrivateLibrary)
add_executable(MyExecutable main.cpp)
target_link_libraries(MyExecutable PRIVATE MyLibrary)
在上面的示例中,MyLibrary
被链接到 SomePublicLibrary
使用 PUBLIC
,这意味着任何链接到 MyLibrary
的目标也会自动链接到 SomePublicLibrary
。而 SomePrivateLibrary
则会被链接为 MyLibrary
的私有依赖项,不会传递给其他链接到 MyLibrary
的目标。最后,MyLibrary
作为私有链接被链接到 MyExecutable
。
总之,默认情况下,如果没有显式地指定链接类型,CMake 会将库的链接默认视为 PRIVATE
。
unit test中target_link_libraries不写public/private的原因
在编写单元测试时,CMakeLists.txt 文件中的 target_link_libraries
不需要显式指定 PUBLIC
、PRIVATE
或 INTERFACE
关键字,因为在这种情况下,链接的库通常被视为 PRIVATE
依赖项。
单元测试通常是在测试目标(test target)中链接测试框架和被测代码,这些库只需要在测试目标中可用,而不需要传递到其他目标。因此,默认情况下,CMake 将链接的库视为 PRIVATE
依赖项,这与正常情况下的 target_link_libraries
不写 PUBLIC
、PRIVATE
或 INTERFACE
效果是一样的。
所以,在单元测试的情况下,如果在 target_link_libraries
中使用 PUBLIC
关键字,可能会导致链接错误或其他问题。这是因为测试目标通常只需要私有地链接到测试框架和被测代码,不需要将这些依赖传递给其他目标。
如果尝试在测试目标中使用 PUBLIC
关键字,CMake 可能会报告链接错误,因为测试框架和被测代码库的符号可能会冲突或导致其他问题。通常情况下,测试目标应该将这些库视为 PRIVATE
依赖项。