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

Архитектура всего моего приложения состоит из этих модулей, которые сами по себе являются проектами, которые могут работать независимо.

Мои цели:

  1. Я хочу скомпилировать свой модуль как библиотеку

  2. Я хочу проверить библиотеку с кодом в папке 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,

Другие вопросы по тегам