PRIVATE: 当你的目标需要库,但不希望其他链接到你的目标的库或可执行文件继承这个库时,选择PRIVATE。它反映了一个明确的意图:这个库只是为当前目标服务的。 PUBLIC: 当你的目标和其他链接到你的目标的库或可执行文件都需要这个库时,选择PUBLIC。这意味着这个库是公共的依赖项,其他目标也可能需要它。 INTERFACE: 当...
在CMake中,当我们定义一个库或可执行文件,并希望它依赖于其他库或目标时,我们可以使用target_link_libraries或target_sources等命令来建立这种依赖关系。但除了这些基本命令,CMake还提供了三个关键字:PUBLIC, PRIVATE, 和 INTERFACE,用于更细致地控制这些依赖关系的作用域和可见性。 PUBLIC 当我们将一个目标A链接到另...
CMake中的关键字PUBLIC,INTERFACE, PRIVATE 与C++语言中类继承时使用的public、private的作用非常相似。结合VSCode编写具体代码来演示这几个关键字的实际用途。 1、代码结构 CMakeLists.txt cmake_minimum_required(VERSION 3.5) project(App) add_library(libA STATIC libA/libA.cpp) target_include_directories(libA ...
PRIVATE: 当你的目标需要库,但不希望其他链接到你的目标的库或可执行文件继承这个库时,选择PRIVATE。它反映了一个明确的意图:这个库只是为当前目标服务的。 PUBLIC: 当你的目标和其他链接到你的目标的库或可执行文件都需要这个库时,选择PUBLIC。这意味着这个库是公共的依赖项,其他目标也可能需要它。 INTERFACE: 当...
最近看了很多项目的代码,代码是用cmake编译的,由于各种库之间链接关系错综复杂,加上PRIVATE,PUBLIC,INTERFACE属性值,我在添加代码的时候总会遇到稀奇古怪的编译的问题,网上看了很多文章,写的都不是很靠谱,正好看到一个b站视频讲的不错,解决了我很多疑惑,我又有了新的疑惑,折腾了一晚上终于把这个搞明白了,分享给大家...
最近看了很多项目的代码,代码是用cmake编译的,由于各种库之间链接关系错综复杂,加上PRIVATE,PUBLIC,INTERFACE属性值,我在添加代码的时候总会遇到稀奇古怪的编译的问题,网上看了很多文章,写的都不是很靠谱,正好看到一个b站视频讲的不错,解决了我很多疑惑,我又有了新的疑惑,折腾了一晚上终于把这个搞明白了,分享给大家...
简介:[√]cmake的链接属性PRIVATE、PUBLIC、INTERFACE权限控制 include_directories(${CMAKE_CURRENT_LIST_DIR}) 这种非Target的命令会影响全局的编译器,所以在大型项目里面,推荐使用cmake现代的target api。 举例: target_include_directories(lib1 PRIVATE ${CMAKE_CURRENT_LIST_DIR})target_link_libraries(app PRIVA...
PUBLIC:公开的。PUBLIC = PRIVATE + INTERFACE。生成 libhello-world.so 时,在 hello_world.c 和 hello_world.h 中都包含了 hello.h。并且 main.c 中也需要使用 libhello.so 提供的功能。那么在 hello-world/CMakeLists.txt 中应该写入: target_link_libraries(hello-world PUBLIC hello)target_include_direct...
网上关于 target_link_libraries 中的PRIVATE, PUBLIC , INTERFACE 的解释大部分是错的,而且不是一般的错,是胡说。 因为这三个属性在不同的命令中使用时意义不同,有很多是从target_include_libraries中抄来的。 以下的解释主要场景是linux中,windows不存在这种关系,无需考虑。
INTERFACE作用是在编译ibhello.so的时候,不使用这些参数,但是在编译需要链接libhello.so的目标(应用程序或者库)时,编译指令中加入这些参数。换句话说就是把这些参数传给这个库的使用者。 PUBLIC是INTERFACE 和 PRIVATE的两种功能的合并。也就是编译当前目标使用这个参数,编译这个目标的使用者时,也使用这个参数。