CMake add_subdirectory () - PullRequest
       8

CMake add_subdirectory ()

2 голосов
/ 19 июля 2011

Введение:

Я пытаюсь использовать CMake для получения сценариев кросс-платформенной компиляции (для VS 9.0 на Windows32 и Makefiles для Unix).

Яиспытываю что-то, чего я не могу понять о add_subdirectory ().

Позвольте мне показать вам мой код:

Контекст:

Моя архитектура для модуляимя "module1" выглядит примерно так:

  • CMakeLists.txt
  • include /
    • file1.h
    • file2.h
    • *. Ч
  • src /
    • file1.cpp
    • file2.cpp
    • *. Cpp
  • test /
    • 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 в каталоге test / и создать мое решение MyProjectTest.sln?

Я используюГрафический интерфейс CMake для запуска корневого CMakeLists.txt в каталоге сборки, который я создаю в корне моего модуля.Когда я исследую каталог сборки, я могу найти мой MyProjet.sln, папку test /, но в нем нет MyProjectTest.sln!

Ответы [ 2 ]

2 голосов
/ 20 июля 2011

Это может не решить вашу исходную проблему, но в вашем 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.

1 голос
/ 20 июля 2011

После трех дней попыток все, я наконец нашел ответ ... Сэр DLRdave был на самом деле прав: проблема была не в самом коде, а в чем-то "вне кода".

Найдена проблема:

Я создал и отредактировал все свои файлы с помощью Блокнота ++. На самом деле при открытии файлов с помощью блокнота Windows (потому что мне было любопытно) появился странный прямоугольный символ, и файл не был похож на тот, который я обычно вижу в Notepad ++ Я обнаружил, что это был символ «\ n \ r», который Notepad ++ не показывал мне (он должен быть отфильтрован), но при работе с блокнотом Windows вы могли видеть, что весь файл был «нечистым» и отображался в одной строке. макета, который я видел в Notepad ++.

Так как эта ошибка «кодирования» появилась только в подкаталоге CMakeLists, она не может быть прочитана, но не говорит об ошибке при интерпретации с CMake, и, вероятно, поэтому у меня не было возвращенной ошибки при запуске CMake.

Решение:

Я использовал инструмент native2ascii.exe из Java для исправления ошибки кодирования.

Почему:

На самом деле это, вероятно, означает, что синтаксический синтаксический анализатор CMake, вероятно, не предназначен для фильтрации этого типа символов, появляющихся со странной кодировкой, поэтому он дал мне 3 дня интенсивной отладки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...