CMake add_subdirectory()
Вступление:
Я пытаюсь использовать CMake для получения сценариев кросс-платформенной компиляции (для VS 9.0 на Windows32 и Makefiles для Unix).
Я испытываю что-то, что я не могу понять о add_subdirectory().
Позвольте мне показать вам мой код:
Контекст:
Моя архитектура для модуля с именем "module1" выглядит примерно так:
- CMakeLists.txt
- включают/
- file1.h
- file2.h
- *.час
- SRC /
- file1.cpp
- file2.cpp
- *.cpp
- тестовое задание/
- CMakeLists.txt
- SRC /
- testfile1.cpp
- testfile2.cpp
Архитектура всего моего приложения состоит из этих модулей, которые сами по себе являются проектами, которые могут работать независимо.
Мои цели:
Я хочу скомпилировать свой модуль как библиотеку
Я хочу проверить библиотеку с кодом в папке test /
Вот CMakeLists, которые я написал:
Это CMakeLists.txt в корневом каталоге моего модуля.
#ENSURE MINIMUM VERSION OF CMAKE
cmake_minimum_required(VERSION 2.8)
#CONFIGURATION OF THE PROJECT
#NAME OF THE PROJECT
project(MyProject)
#OUTPUT OF THE PROJECT
set(LIBRARY_OUTPUT_PATH lib/${CMAKE_BUILD_TYPE})
#ADD THE HEADERS OF THE LIBRARY BEING CREATED
include_directories(include)
#ADD 3rd PARTY OPENCV LIBRARIES
find_package(OpenCV REQUIRED)
#ADD 3rd PARTY XERCES LIBRARIES
include_directories(${XERCES_INCLUDE_DIR})
link_directories(${XERCES_LIB_DIR})
set(Xerces_LIBS xerces-c_3D.lib)
#CONFIGURATION OF THE LIBRARY
file(GLOB_RECURSE MYPROJECT_MODULE_CXX src/*)
file(GLOB_RECURSE MYPROJECT_MODULE_HDR include/*)
#NAME OF THE PRESENT LIBRARY
set(MYPROJECT_MODULE_LIB_NAME myModuleLib)
add_library(${MYPROJECT_MODULE_LIB_NAME}
SHARED
${MYPROJECT_MODULE_CXX}
${MYPROJECT_MODULE_HDR}
)
target_link_libraries(${MYPROJECT_MODULE_LIB_NAME}
${OpenCV_LIBS}
${Xerces_LIBS}
)
#CONTINUE IN THE SUB FOLDERS
add_subdirectory(test)
И затем, в папке test /, здесь находится CMakeLists.txt
#ENSURE MINIMUM VERSION OF CMAKE
cmake_minimum_required(VERSION 2.8)
#CONFIGURATION OF THE PROJECT
#NAME OF THE PROJECT
project(MyProjectTest)
#OUTPUT OF THE PROJECT
set(EXECUTABLE_OUTPUT_PATH bin/${CMAKE_BUILD_TYPE})
#ADD OUR TESTED LIBRARY
include_directories(../include)
link_directories(../build/lib/${CMAKE_BUILD_TYPE})
#CONFIGURATION OF THE EXE
file(GLOB_RECURSE MYPROJECT_MODULE_TEST_CXX src/*)
#NAME OF THE PRESENT EXECUTABLE
set(MYPROJECT_MODULE_TEST_BIN_NAME myModuleTest)
add_executable(${MYPROJECT_MODULE_TEST_BIN_NAME}
${MYPROJECT_MODULE_TEST_CXX}
)
target_link_libraries(${MYPROJECT_MODULE_TEST_BIN_NAME}
${MYPROJECT_MODULE_LIB_NAME}
)
Вопрос
CMake выводит правильное решение MyProject.sln Visual Studio 9.0, которое успешно компилируется в моей библиотеке, связанной с OpenCV и Xerces (и другими библиотеками третьей части). Однако тестовый двоичный файл не выводил никакого MyProjectTest.sln.
Я подумал ( и прочитал в документации по CMake), что add_subdirectory (dir) использовался для создания CMake в следующем подкаталоге (я имею в виду, что имя не может быть более понятным:p!), Поэтому он не должен продолжать CMake в проверить / каталог и создать мое решение MyProjectTest.sln?
Я использую графический интерфейс CMake для запуска корневого файла CMakeLists.txt в каталоге сборки, который я создаю в корне моего модуля. Когда я изучаю каталог сборки, я могу найти мой MyProjet.sln, папку test /, но в ней нет MyProjectTest.sln!
2 ответа
После трех дней, пытаясь все, я наконец нашел ответ... Сэр DLRdave был на самом деле прав: проблема была не в самом коде, а в чем-то "вне кода".
Проблема найдена:
Я создал и отредактировал все мои файлы с помощью Notepad++. На самом деле при открытии файлов с помощью блокнота Windows (потому что мне было любопытно) появился странный символ прямоугольника, и файл не был похож на тот, который я обычно вижу в Notepad++. Я обнаружил, что этот символ был "\ n \ r", что и Notepad ++ не показывать мне (он должен быть отфильтрован), но, перейдя в блокнот Windows, вы могли видеть, что весь файл был "нечистым" и отображался в одной строке вместо макета, который я видел в Notepad++.
Так как эта ошибка "кодирования" появилась только в подкаталоге CMakeLists, она не могла быть прочитана, но не сказала ошибки при интерпретации с CMake, и, вероятно, поэтому у меня не было возвращенной ошибки при запуске CMake.
Решение:
Я использовал инструмент native2ascii.exe из Java для исправления ошибки кодирования.
Почему:
На самом деле это, вероятно, означает, что синтаксический синтаксический анализатор CMake, вероятно, не был разработан для фильтрации этого типа символов, появляющихся со странной кодировкой, поэтому он дал мне 3 дня интенсивной отладки.
Это может не решить вашу первоначальную проблему, но в вашем test/folder/CMakeLists.txt
попробуйте изменить
#ADD OUR TESTED LIBRARY
include_directories(../include)
link_directories(../build/lib/${CMAKE_BUILD_TYPE})
в
#ADD OUR TESTED LIBRARY
include_directories(${CMAKE_SOURCE_DIR}/include)
link_directories(${CMAKE_BINARY_DIR}/lib/${CMAKE_BUILD_TYPE})
в противном случае вы предполагаете, что ваша папка сборки всегда называется build
,