cmakelists 里面 target_link_libraries 的 PUBLIC 和 PRIVATE 有什么区别
时间: 2023-08-05 21:48:50 浏览: 55
在CMake中,target_link_libraries命令用于将一个或多个库链接到一个目标中。当使用PUBLIC或PRIVATE修饰符时,它们会影响链接库的可见性。
- PUBLIC修饰符:链接库将会被添加到目标中,并且同时被传递给依赖该目标的其他目标。也就是说,链接库将会被公开,对于使用该目标的其他目标来说,这个库也是可见的。
- PRIVATE修饰符:链接库将被添加到目标中,但不会被传递给依赖该目标的其他目标。也就是说,链接库只对该目标本身可见。
因此,PUBLIC和PRIVATE修饰符主要用于控制链接库的可见性,以便在构建一个可靠的和可维护的代码库时使用。
相关问题
CMakeLists.txt中的target_link_libraries(xxx PRIVATE pthread)什么作用?
`target_link_libraries(xxx PRIVATE pthread)` 的作用是将 `xxx` 目标(通常是一个可执行文件或库)与 `pthread` 库链接。`pthread` 是 POSIX 线程库,提供了一套线程 API,可以在多线程程序中使用。
`PRIVATE` 表示链接库时只对当前目标生效,如果 `xxx` 依赖的其他目标也需要链接 `pthread`,则需要将 `PRIVATE` 替换为 `PUBLIC` 或 `INTERFACE`。`PUBLIC` 表示链接库时当前目标和依赖它的其他目标都会生效,`INTERFACE` 表示只对依赖它的其他目标生效,当前目标不会链接该库。
在 CMakeLists.txt 中,可以通过 `find_package(Threads)` 来查找并链接线程库,这样就不需要显式地写出 `pthread` 了。例如:
```
find_package(Threads REQUIRED)
target_link_libraries(xxx PRIVATE Threads::Threads)
```
这种方式可以跨平台地链接线程库,而不需要手动写出特定平台的线程库名称。
CMake Error at CMakeLists.txt:89 (target_link_libraries): The INTERFACE, PUBLIC or target_link_libraries(your_target_name PRIVATE OpenSSL::SSL OpenSSL::Crypto) PRIVATE option must appear as the second argument, just after the target name.
这个错误是因为在调用 `target_link_libraries` 命令时,没有正确指定链接选项的位置。
在 CMake 中,`target_link_libraries` 命令的语法如下:
```cmake
target_link_libraries(target-name [PRIVATE|PUBLIC|INTERFACE] library-name1 [library-name2 ...])
```
其中,`target-name` 表示要链接的目标名称,`library-name1`、`library-name2` 等表示要链接的库名称。选项 `PRIVATE`、`PUBLIC` 和 `INTERFACE` 用于指定链接选项的作用范围,必须紧跟在 `target-name` 后面。
如果你遇到了类似于 "CMake Error at CMakeLists.txt:89 (target_link_libraries): The INTERFACE, PUBLIC or PRIVATE option must appear as the second argument, just after the target name." 的错误,通常是因为在调用 `target_link_libraries` 命令时,没有正确指定链接选项的位置,导致 CMake 无法正确解析命令。
为了解决这个问题,你需要将 `PRIVATE`、`PUBLIC` 或 `INTERFACE` 选项放在目标名称之后,例如:
```cmake
target_link_libraries(your-target-name PRIVATE library-name1 library-name2 ...)
```
在你的情况下,你需要将 `PRIVATE` 选项放在目标名称之后,例如:
```cmake
target_link_libraries(your_target_name PRIVATE OpenSSL::SSL OpenSSL::Crypto)
```
这样就可以正确指定链接选项的位置,避免出现上述错误。