【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 依赖项。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您的 `.gcda` 文件和 `.cpp` 文件不在同一目录下,您需要在编译使用 `--coverage` 选项来生成 `.gcda` 文件,并使用 `--object-directory` 选项指定 `.gcda` 文件的输出目录。然后,您可以在使用 gocv 入这个目录到 `LD_LIBRARY_PATH` 环境变量,以便 gocv 可以找到 `.gcda` 文件。 以下是一个示例 cmake 文件: ```cmake cmake_minimum_required(VERSION 3.10) project(my_project) # 指定编译选项 set(CMAKE_CXX_FLAGS "--coverage") set(CMAKE_C_FLAGS "--coverage") # 指定输出目录 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) # 添 gocv 库 find_package(OpenCV REQUIRED) include_directories(${OpenCV_INCLUDE_DIRS}) link_directories(${OpenCV_LIBRARY_DIRS}) add_definitions(${OpenCV_DEFINITIONS}) # 添源代码 add_executable(my_executable main.cpp) # 指定 gcda 文件输出目录 set_target_properties(my_executable PROPERTIES COMPILE_FLAGS "--coverage" LINK_FLAGS "--coverage" RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin PDB_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin OUTPUT_NAME my_executable) # 链接 gocv 库 target_link_libraries(my_executable ${OpenCV_LIBS}) ``` 在这个示例,我们使用了 `--coverage` 编译选项,并使用 `set_target_properties` 函数指定了 `.gcda` 文件的输出目录。在运行程序,您可以使用以下命令来设置 `LD_LIBRARY_PATH` 环境变量: ```sh export LD_LIBRARY_PATH=/path/to/gcda/folder:$LD_LIBRARY_PATH ``` 将 `/path/to/gcda/folder` 替换为您指定的 `.gcda` 文件的输出目录。 注意:这里的 `LD_LIBRARY_PATH` 环境变量是在运行程序使用的,需要在运行程序前设置。如果您希望在每次启动终端自动设置这个环境变量,可以将上述命令添到您的 shell 配置文件(如 `~/.bashrc` 或 `~/.zshrc`)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值