CMake target_link_libraries接口依赖项


Answers:


201

如果要创建共享库,并且源cpp文件#include另一个库的标头(例如,QtNetwork),但是标头文件不包含QtNetwork标头,则QtNetwork是一个PRIVATE依赖项。

如果您的源文件和标头包含另一个库的标头,则它是一个PUBLIC依赖项。

如果您的头文件而不是源文件包括另一个库的头,则它是一个INTERFACE依赖项。

的其他构建属性PUBLICINTERFACE依赖项会传播到使用的库。http://www.cmake.org/cmake/help/v3.0/manual/cmake-buildsystem.7.html#transitive-usage-requirements


40
这是我听过的最清楚的解释。我希望cmake文档一样清晰!:-)
Ela782

1
感谢您的解释,我现在明白含义了,但是为什么指定PUBLICPRIVATE重要?它会发生什么变化?
user3667089

8
使用PRIVATE不会将您的依赖项添加到链接到库的项目中。它更干净,并且还避免了依赖项和用户之间的可能冲突。
user2658323 '17

7
@steveire为了清楚起见,可能需要明确指出“ include”是指传递性包含,而不仅仅是直接包含。例如,如果另一个库的头文件仅直接包含在您的头文件中,但是所有头文件都包含在您的源文件中,那么您的源文件会传递性地包含另一个库的头文件,因此您具有PUBLIC依赖项,而不是一个INTERFACE依赖。
Ose

cmake文档应该像此答案一样简洁!
Bryan Jyh Herng Chong
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.