如果B link C时用public 指示, 当编译A时,就会检查到C中的符号没有实现,此时你就会知道要把C link到A来解决这个问题了。 其实private/public 解决的是指示问题,本质上可以使用public 来解决, 可以减少坑。 下面是target_link_libraries中的解释,不想看英文的,直接拉到最后。 Link Inheritance Similarly, for any...
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自...
命名的<target>必须由诸如add_executable或add_library之类的命令创建,并且不能为ALIAS target。 通过显式使用AFTER或BEFORE,你可以独立于默认值在追加和前置(appending and prepending)之间进行选择。 INTERFACE,PUBLIC和PRIVATE关键字用于指定以下参数的作用域(scope)。PRIVATE和PUBLIC项将填充<target>的INCLUDE_DIRECTORIES...
所以,使用PRIVATE PUBLIC和INTERFACE就能控制是否将当前搜索路径传递给下一个目标。 PRIVATE就是不把当前的INCLUDE_DIRECTORIES 传递给INTERFACE_INCLUDE_DIRECTORIES 。 PUBLIC就是把当前的INCLUDE_DIRECTORIES 传递给INTERFACE_INCLUDE_DIRECTORIES 。 INTERFACE就是自己不使用当前的INCLUDE_DIRECTORIES ,但是把当前的INCLUDE_DIRECT...
如果目标的头文件中包含了依赖的头文件(源文件间接包含),那么这里就是PUBLIC 如果目标仅源文件中包含了依赖的头文件,那么这里就是PRIVATE 如果目标的头文件包含依赖,但源文件未包含,那么这里就是INTERFACE https://cmake.org/cmake/help/v3.0/manual/cmake-buildsystem.7.html#transitive-usage-requirements...
target_link_libraries(target_name [PRIVATE|PUBLIC|INTERFACE] library_name1 library_name2 ...) 其中: target_name是目标名称,可以是可执行文件、库或模块。 PRIVATE、PUBLIC和INTERFACE是可选的关键字,用于指定链接库的属性。具体含义如下: oPRIVATE:仅将库链接到目标自身。 oPUBLIC:将库链接到目标自身,并将库...
target_name是要链接库的目标的名称,例如一个可执行文件或一个库。PRIVATE,PUBLIC和INTERFACE是可选的...
Other build properties of PUBLIC and INTERFACE dependencies are propagated to consuming libraries.http://www.cmake.org/cmake/help/v3.0/manual/cmake-buildsystem.7.html#transitive-usage-requirements
通过它,我们可以指定目标所依赖的库、包括系统库、自定义库以及外部库等。同时,在链接库的过程中可以通过PRIVATE、PUBLIC和INTERFACE等修饰符来控制库的可见性和传递行为。 以上就是cmake target_link_libraries用法的一些解释和示例。希望这篇文章能对你有所帮助!
<PRIVATE|PUBLIC|INTERFACE> 是可选的作用域关键字,用于指定链接的依赖项和链接接口的传播范围。 <item> 可以是一个库目标的名称、库文件的完整路径、普通的库名称、链接标志、生成器表达式或构建配置的关键字。要链接多个库,你只需在 <item> 参数中列出所有需要链接的库即可。例如: ...