Я использую CMake в небольшом проекте C ++, и пока он отлично работает ... с одним поворотом: x
Когда я изменяю заголовочный файл, обычно требуется перекомпилировать несколько исходных файлов (те,которые включают это, прямо или косвенно), однако кажется, что cmake обнаруживает только некоторые исходных файлов для перекомпиляции, что приводит к поврежденному состоянию.Я могу обойти это, уничтожив проект и перестроив его с нуля, но это позволяет обойти цель использования утилиты make: перекомпилировать только то, что нужно.
Поэтому, я полагаю, я делаю что-то не так.
Мой проект очень просто организован:
- верхний каталог, в котором находятся все ресурсы, там находится главный CMakeLists.txt
- каталог "include", где все публичные заголовкилежит (в разных подкаталогах)
- каталог "src", где находятся все подкаталоги исходных файлов, там находится src CMakeLists.txt
- CMakeLists.txt для каждого подкаталога в "src"directory
Основной каталог содержит:
cmake_minimum_required(VERSION 2.8)
project(FOO)
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin)
# Compiler Options
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -std=c++0x -Wall -Wextra -Werror")
include_directories($(FOO_SOURCE_DIR)/include)
add_subdirectory(src)
Каталог "src":
add_subdirectory(sub1)
add_subdirectory(sub2)
add_subdirectory(sub3)
add_subdirectory(sub4)
add_executable(foo main.cpp)
target_link_libraries(foo sub1 sub2 sub3 sub4)
Где sub4
зависит от sub3
, что зависитна sub2
, который зависит от sub1
И пример подкаталога (sub3):
set(SUB3_SRCS
File1.cpp
File2.cpp
File3.cpp
File4.cpp
File5.cpp
File6.cpp
)
add_library(sub3 ${SUB3_SRCS})
target_link_libraries(sub3 sub1 sub2)
Я был бы рад, если бы кто-нибудь мог указать мне на мою ошибку, ищаздесь или на CMake ничего не далоg, так что я думаю, что это очень просто или должно работать из коробки ...
(для справки, я использую cmake версии 2.8.2 на MSYS)
EDIT :
Благодаря предложению Билла я проверил файл depend.make
, сгенерированный CMake, и он действительно отсутствует (строго).Вот пример:
src/sub3/CMakeFiles/sub3.dir/File1.cpp.obj: ../src/sub3/File1.cpp
Да, вот и все, ни на один из включений не было ссылок вообще: x