CMake target_link_libraries Interface Dependencies
If you are creating a shared library and your source cpp
files #include
the headers of another library (Say, QtNetwork
for example), but your header files don't include QtNetwork
headers, then QtNetwork
is a PRIVATE
dependency.
If your source files and your headers include the headers of another library, then it is a PUBLIC
dependency.
If your header files other than your source files include the headers of another library, then it is an INTERFACE
dependency.
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
@steveire accepted answer is great. I just wanted to add a table to quickly see the difference:
.-----------.------------------.----------------.
| | Linked by target | Link interface |
:-----------+------------------+----------------:
| PUBLIC | X | X |
:-----------+------------------+----------------:
| PRIVATE | X | |
:-----------+------------------+----------------:
| INTERFACE | | X |
'-----------'------------------'----------------'
- Linked by target: libraries included in target sources (not a dependency for projects linking the library).
- Link interface: libraries included in target public headers (dependencies for projects linking the library).