这是c ++项目的文件夹层次结构:
1. FolderA
1. file1.h/cpp
2. CMakeLists.txt (CmakeA)
2. FolderB
1. file2.h/cpp
2. CMakeLists.txt (CmakeB)
3. main.cpp
4. CMakeLists.txt (CmakeAll)
Run Code Online (Sandbox Code Playgroud)
CmakeA:
file(GLOB FolderA_FILES *.cpp *.h *.hpp)
# add component
add_library(FolderA ${FolderA_FILES})
include_directories(../FolderB)
target_link_libraries(FolderA FolderB)
Run Code Online (Sandbox Code Playgroud)
CMakeB:
file(GLOB FolderB_FILES *.cpp *.h *.hpp)
# add component
add_library(FolderB ${FolderB_FILES})
Run Code Online (Sandbox Code Playgroud)
CMakeAll:
cmake_minimum_required(VERSION 2.8)
#add smirk dependency
set(Smirk_DIR /usr/local CACHE PATH "Directory where Smirk has been installed (e.g. /usr/local).")
include(${Smirk_DIR}/cmake/smirk.cmake)
smirk_project(operatingTableProject)
file(GLOB smirk_operatingTableProject_FILES *.cpp *.h *.hpp)
add_executable(smirk_operatingTableProject ${smirk_operatingTableProject_FILES})
# install directives
install(
TARGETS smirk_operatingTableProject
RUNTIME DESTINATION bin
)
#add FolderB dependency
add_subdirectory(FolderB)
target_link_libraries(smirk_operatingTableProject FolderB)
#add FolderA dependency
add_subdirectory(FolderA)
target_link_libraries(smirk_operatingTableProject FolderA)
Run Code Online (Sandbox Code Playgroud)
在file1.h我包括file2.h.问题是main.cpp FolderA/file1.h我收到的任何地方都有编译问题:
file2.h: No such file or directory (in file1.h)
Run Code Online (Sandbox Code Playgroud)
但是,如果我在其中注释掉包含main.cpp,它就可以了.此外,如果我包含file2.h在file1.cpp其中工作,所以主要问题是我从其他子目录的另一个头文件中的子目录中包含头文件,其中一个包含在主文件中.
任何帮助,将不胜感激.
命令include_directories仅影响本地范围:在其中发出仅FolderA影响库的编译.您需要在顶层发出该命令以进行编译.FolderACMakeLists.txtmain.cpp
或者,您可以在以下位置使用带有PUBLIC选项的命令target_include_directories:FolderA
target_include_directories(FolderA PUBLIC ../FolderB)
Run Code Online (Sandbox Code Playgroud)
所以include目录将传播到与该库链接的任何目标.