2016-12-15 4 views
1

Здесь нет иерархии папок из С ++ проекта:Нет такого файла или каталога с помощью CMake

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) 

CmakeA:

file(GLOB FolderA_FILES *.cpp *.h *.hpp) 

# add component 
add_library(FolderA ${FolderA_FILES}) 

include_directories(../FolderB) 
target_link_libraries(FolderA FolderB) 

CMakeB:

file(GLOB FolderB_FILES *.cpp *.h *.hpp) 

# add component 
add_library(FolderB ${FolderB_FILES}) 

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) 

В file1.h включите file2.h. Проблема заключается в том, где я включаю в main.cppFolderA/file1.h я получил вопрос компиляции:

file2.h: No such file or directory (in file1.h) 

Но если я закомментируйте включить в main.cpp, это работает. Кроме того, если я включаю file2.h в file1.cpp, это работает, поэтому основная проблема заключается в том, где я включаю заголовочный файл из подкаталога в другой файл заголовка из другого подкаталога, и один из них включен в основной файл.

Любая помощь будет оценена по достоинству.

+0

с двойными кавычками "" – Maystro

ответ

5

Команда include_directories влияет только на местных сферы: выпускается в FolderA она влияет только на компиляции FolderA библиотеки. Вам необходимо передать эту команду на верхнем уровне CMakeLists.txt для компиляции main.cpp.

В качестве альтернативы, вы можете использовать команду target_include_directories с ОБЩЕСТВЕННОГО варианта в FolderA:

target_include_directories(FolderA PUBLIC ../FolderB) 

так включать каталоги будут распространяться на любую цель, которая связана с этой библиотекой.

+0

Спасибо. Он работает сейчас. – Maystro

 Смежные вопросы

  • Нет связанных вопросов^_^