我正在尝试构建一个具有以下目录结构的库:
lib1
|-include
| |-lib1
| |-public.h
|-src
| |-private.h
| |-private.cpp
| |-public.cpp
|-lib
| |-liblib1.a
|-CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)
公共标头包含私有标头以使用其功能。
我的CMakeLists.txt
样子如下:
project(math)
set(SRC_FILES src/private.cpp src/public.cpp)
add_library(${PROJECT_NAME} STATIC ${SRC_FILES})
target_include_directories(
${PROJECT_NAME}
PUBLIC
"${CMAKE_CURRENT_SOURCE_DIR}/include"
PRIVATE
"${CMAKE_CURRENT_SOURCE_DIR}/src"
)
set_target_properties(
${PROJECT_NAME}
PROPERTIES
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/lib"
)
Run Code Online (Sandbox Code Playgroud)
但是当我尝试构建库时,我收到一个错误,public.h
说没有文件private.h
当谷歌搜索时,我要么找到不使用的相当旧的帖子,target_include_directories
要么它们通过将所有文件放在同一目录中来支持不干净的结构
如果包含标头,则必须说明该标头在哪里。如果您说标头是私有的,那么您并没有告诉依赖项标头在哪里。当依赖项通过公共头包含私有头时,他们不知道它在哪里。
解决方案:将公共标头包含的所有标头设为公开。或者换句话说:不要在公共标头中包含私有标头。