当然了,在最终子目录的 CMakeLists.txt 文件中,使用include_directories()和target_include_directories()的效果是相同的。 4. 目录划分 每一个目录都是一个模块,目录内部应将对外和对内的头文件进行区分,由模块的调用者决定模块是否被传递(PRIVATE,INTERFACE,PUBLIC)。
在CMake中,当我们定义一个库或可执行文件,并希望它依赖于其他库或目标时,我们可以使用target_link_libraries或target_sources等命令来建立这种依赖关系。但除了这些基本命令,CMake还提供了三个关键字:PUBLIC, PRIVATE, 和 INTERFACE,用于更细致地控制这些依赖关系的作用域和可见性。 PUBLIC 当我们将一个目标A链接到另...
当然了,在最终子目录的 CMakeLists.txt 文件中,使用include_directories()和target_include_directories()的效果是相同的。 4. 目录划分 每一个目录都是一个模块,目录内部应将对外和对内的头文件进行区分,由模块的调用者决定模块是否被传递(PRIVATE,INTERFACE,PUBLIC)。 5. 参考: https://cmake.org/pipermail/c...
PUBLIC 在public后面的库会被Link到你的target中,并且里面的符号也会被导出,提供给第三方使用。 PRIVATE 在private后面的库仅被link到你的target中,并且终结掉,第三方不能感知你调了啥库 INTERFACE 在interface后面引入的库不会被链接到你的target中,只会导出符号。 --- 更新--- targe...
以target_link_libraries(A B)命令为例,从理解的角度解释:PRIVATE依赖项B仅链接到目标A,若有C链接...
对于public的property,会传递,也自己用。 对于interface的property,会传递,但不会自己用public和interface的属性是可传递属性 可见性的传递是依靠target_link_libraries,传递的规则如下: 假设如下链接关系 target_link_libraries(B XXX A)// XXX为private,public,interface如果XXX为private,A的可传递属性变成B的privatepro...
每一个Target对于自身设置的不同属性处理 代码语言:javascript 复制 对于private的property,不会传递,只会自己用。 对于public的property,会传递,也自己用。 对于interface的property,会传递,但不会自己用public和interface的属性是可传递属性 可见性的传递是依靠target_link_libraries,传递的规则如下: ...
简介:[√]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...
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...]) 1. 2. 3. target_link_libraries(<target> ... <item>... ...) 1. 通过cmake编译一个libhello.so,并且在编译hello时指定一个宏定义DEBUG,指定一个头文件搜索路径 ./include,指定一个优化选项-o2,指定一个pthread库: ...
target_link_libraries(bar PUBLIC foo)链接为public,main函数正常调用foo(),bar中正常调用foo(),库foo链接给bar,同时foo也被传给了main。 target_link_libraries(bar PRIVATE foo)编译,发现main.cpp: undefined reference to `foo()',main.cpp这个编译单元找不到foo()这个符号,库foo链接到bar就被终结了,bar自...