Я использую CMake на небольшом проекте С++, и пока он отлично работает... с одним поворотом: x
Когда я изменяю заголовочный файл, обычно требуется перекомпилировать несколько исходных файлов (те, которые включают его, прямо или косвенно), однако кажется, что cmake только обнаруживает некоторые из исходных файлов, которые должны быть перекомпилированы, что приводит к повреждению государство. Я могу обойти это, уничтожив проект и перестроив его с нуля, но это обходит цель использования утилиты make: только перекомпилировать то, что нужно.
Поэтому я полагаю, что я делаю что-то неправильно.
Мой проект очень просто организован:
- верхний каталог, где сидят все ресурсы, находится главный CMakeLists.txt
- каталог "include", в котором находятся все публичные заголовки (в разных подкаталогах)
- каталог "src" , где все подкаталоги для файлов источников, src CMakeLists.txt находится там
- CMakeLists.txt для подкаталога в каталоге "src"
В главном каталоге есть:
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 ничего не принес, поэтому я думаю, это очень просто или должно работать из коробки...
(для справки, я использую cmake версии 2.8.2 на MSYS)
ИЗМЕНИТЬ
Благодаря предложению Билла я проверил файл depend.make
, созданный CMake, и он действительно отсутствует (строго). Вот пример:
src/sub3/CMakeFiles/sub3.dir/File1.cpp.obj: ../src/sub3/File1.cpp
Да, что все, кроме включений, ссылались вообще: x