【Cmake】在cmakeList中给unit test cpp文件link library时不加public/private的原因

target_link_libraries的用法

首先,我们来复习一下 target_link_libraries关键字的用法:
在CMake中,target_link_libraries 函数用于将一个目标(例如可执行文件、库)与其他库进行链接。当不明确指定链接类型(public、private 或 interface)时,CMake 默认使用 PRIVATE 链接类型。

这意味着,如果在 target_link_libraries 中不写 PUBLICPRIVATEINTERFACE,那么所有链接的库都将被视为 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 不需要显式指定 PUBLICPRIVATEINTERFACE 关键字,因为在这种情况下,链接的库通常被视为 PRIVATE 依赖项。

单元测试通常是在测试目标(test target)中链接测试框架和被测代码,这些库只需要在测试目标中可用,而不需要传递到其他目标。因此,默认情况下,CMake 将链接的库视为 PRIVATE 依赖项,这与正常情况下的 target_link_libraries 不写 PUBLICPRIVATEINTERFACE 效果是一样的。

所以,在单元测试的情况下,如果在 target_link_libraries 中使用 PUBLIC 关键字,可能会导致链接错误或其他问题。这是因为测试目标通常只需要私有地链接到测试框架和被测代码,不需要将这些依赖传递给其他目标。

如果尝试在测试目标中使用 PUBLIC 关键字,CMake 可能会报告链接错误,因为测试框架和被测代码库的符号可能会冲突或导致其他问题。通常情况下,测试目标应该将这些库视为 PRIVATE 依赖项。

猜你喜欢

转载自blog.csdn.net/qq_40145095/article/details/132149065