我有一个CMake库add_library(helpers helpers.h)
,我想通过target_include_directories
包含源文件。然后,我必须在PRIVATE
、PUBLIC
和INTERFACE
参数之间进行选择。
它们之间的区别是什么?
我有一个CMake库add_library(helpers helpers.h)
,我想通过target_include_directories
包含源文件。然后,我必须在PRIVATE
、PUBLIC
和INTERFACE
参数之间进行选择。
它们之间的区别是什么?
PRIVATE
: 这些头文件仅供helpers-library本身使用。PUBLIC
: 这些头文件可以被helpers-library本身以及任何使用helpers-library的目标使用,例如通过target_link_libraries(MainApplication PUBLIC libhelpers)
。INTERFACE
: 这些头文件不能被helpers-library使用,只能被使用helpers-library的目标使用。这个示例说明了可能的导入方式。结构:
│ CMakeLists.txt
│ helper.cpp
│ main.cpp
│
├───details_interface
│ details_interface.cpp
│
├───details_private
│ details_private.cpp
│
└───details_public
details_public.cpp
CMakeLists.txt:
cmake_minimum_required(VERSION 3.1)
set(CMAKE_CXX_STANDARD 17)
project(cmake_experiment)
add_executable(cmake_experiment main.cpp)
target_link_libraries(cmake_experiment libhelper)
add_library(libhelper helper.cpp)
target_include_directories(libhelper
INTERFACE details_interface
PUBLIC details_public
PRIVATE details_private)
main.cpp:
#include <iostream>
#include "details_public.cpp"
#include "details_interface.cpp"
// fatal error: details_private.cpp: No such file or directory:
// #include "details_private.cpp"
int main() {
std::cout << "Hello, World!" << std::endl;
return 0;
}
helper.cpp:
#include "details_public.cpp"
#include "details_private.cpp"
// fatal error: details_interface.cpp: No such file or directory:
// #include "details_interface.cpp"
INTERFACE
可以用于任何目标的可见性。但这只对库有意义,很少有头文件不包含在库中。(我刚测试过了,可以肯定这一点。) - fabianINTERFACE
的示例。 - Chris