2016-02-19 4 views
0

Я пытался перенести проект из VS в CMake, но я не уверен, что моя структура проекта вполне подходит для простой миграции:CMake include_directories против файл GLOB

project/ 
|- CMakeLists.txt 
|- build/ 
    |- (cmake stuff) 
|- src/ 
    |- main.cpp 
    |- tests.cpp // also contains a main() 
    |- class1.hpp 
    |- class1.cpp 
    |- class2.hpp 
    |- class2.cpp 
    |- ... 
|- included/ 
    | - (external libs) 

Мой CMakeLists.txt попытка до сих пор была:

cmake_minimum_required(VERSION 2.8 FATAL_ERROR) 
set(CMAKE_LEGACY_CYGWIN_WIN32 0) 

add_executable(webnectar src/main.cpp 
         src/test.cpp) 

enable_testing() 
add_test(tests project) 

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src) 
include_directories(SYSTEM ${CMAKE_CURRENT_SOURCE_DIR}/included) 

Но я получаю ошибки связи с моими собственными классами. Я не понимаю, почему.

В нескольких других вопросах SO я видел, как люди, использующие файловые GLOB-файлы, включали все источники из подпапки, что, я думаю, было бы решением. Тем не менее, мне жаль, что я не понял, почему include_directories недостаточно и почему (если он будет работать) файл GLOB в порядке.

Кроме того, использование файла GLOB будет работать с моей сборкой, потому что у main.cpp и main.cpp есть основная функция.

Хотя это будет выглядеть по-другому (для другого вопроса), рассмотрите этот вопрос как более общий в смысле того, как я могу исправить все эти проблемы с помощью синтаксиса CMake или с более подходящей файловой структурой.

+0

Хм, не следует этим классам . cpp' будет включен в источник? Что касается глобуса: есть плюсы и минусы, но минусы намного больше. – user3159253

+0

@ user3159253, я думал, что они будут, поскольку CMake находит заголовки. Но у меня возникают связи ошибок с этими классами. 'неопределенная ссылка на« class1 ctor »и т. д. – VillasV

ответ

1
  1. Относительно include_directories Эта директива соответствует -I флаг компилятора и позволяет компилятору найти Header файлов, то есть те, которые включены в #include ....
  2. Вы должны упомянуть все исходные файлы в аргументах add_executable. Это неизбежно.

Вы могли бы составить полный список источников с FILE(GLOB..):

FILE(GLOB webnectar_SOURCES RELATIVE src/ *.cpp) 

, а затем использовать его в add_executable(webnectar ${webnectar_SOURCES}).

Однако это не самый лучший и безопасный вариант, поскольку он содержит значительный недостаток. Список файлов формируется на этапе «настройки» процесса сборки (например, cmake -D<....> -D<.....> .), а затем он никогда не восстанавливается до тех пор, пока файлы CMake (CMakeLists.txt, CMakeCache.txt и т. Д.) Каким-то образом не изменятся. Поэтому, если вы сначала запустите cmake..., а затем добавите новый файл, он не будет замечен, а Makefiles не будет восстановлен.

Кроме того, если некоторые дополнительные файлы (например, оставшиеся после прерванного слияния) соответствуют маске, вы получите некоторые неожиданные результаты.

Так что безопаснее формировать и поддерживать явный список источников, то есть,

set(webnectar_SOURCES 
    src/main.cpp 
    src/class1.cpp 
    src/class2.cpp 
    ... 
) 

, а затем использовать его в add_executable(webnectar ${webnectar_SOURCES}). Имя переменной может быть любым, но некоторые IDE, такие как KDevelop, предпочитают стандартное присвоение имен <artifact>_SOURCES, поэтому они могут автоматически перечислить список для вас (или, по крайней мере, попытаться сохранить :))

+0

Я думаю, это решение, но будет очень неприятно добавлять каждый исходный файл вручную. Это то, как большинство людей на самом деле работает, или они не будут отделять источники от заголовков в первую очередь? – VillasV

+1

На самом деле, кажется, что вопрос является дубликатом древнего: http://stackoverflow.com/questions/1027247/best-way-to-specify-sourcefiles-in-cmake Все плюсы и минусы не изменились с тех пор , – user3159253

+0

О, спасибо. Я этого не нашел. Я хотел бы, чтобы переформатирование структуры папок могло помочь или любое другое решение, кроме файла glob и листинга файлов вручную. – VillasV

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