Подтвердить что ты не робот

CMake с путями include и source - базовая настройка

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

/MainProject/inc/main.h
/MainProject/src/main.cpp
/LibProject/inc/test.h
/LibProject/src/test.cpp

Я нашел несколько руководств, но я не могу узнать, как настроить это, когда у меня есть папка inc и src? Как выглядят файлы CMakeLists.txt? Будет ли у меня один в /, по одному в каждой папке проекта? Кажется, мне не нужно иметь один в папках inc и src?

4b9b3361

Ответ 1

Вам нужен CMakeLists.txt для каждого исходного подкаталога. Ваша структура должна выглядеть примерно так:

root
|-MainProject
| |-inc
| | '-main.h
| |-src
| | |-main.cpp
| | '-CMakeLists.txt
| '-CMakeLists.txt 
|-LibProject
| |-inc
| | '-test.h
| |-src
| | |-test.cpp
| | '-CMakeLists.txt
| '-CMakeLists.txt
'-CMakeLists.txt

Содержимое root/CMakeLists.txt:

project(MyProject)
add_subdirectory(MainProject)
add_subdirectory(LibProject)

Содержимое LibProject/CMakeLists.txt и MainProject/CMakeLists.txt:

add_subdirectory(src)

Содержимое LibProject/src/CMakeLists.txt:

# Notice name prefix of this variable, set by CMake according
# to value given with "project()" in the root CMakeLists.txt.
include_directories(${MyProject_SOURCE_DIR}/LibProject/inc)
add_library(LibProject test.cpp)

Содержимое MainProject/src/CMakeLists.txt:

include_directories(${MyProject_SOURCE_DIR}/MainProject/inc)
# I assume you want to use LibProject as a library in MainProject.
include_directories(${MyProject_SOURCE_DIR}/LibProject/inc)
link_directories(${MyProject_SOURCE_DIR}/LibProject/src)
add_executable(MainProject main.cpp)
target_link_libraries(MainProject LibProject)

Затем настройте и создайте с помощью:

$ cd root
$ mkdir build
$ cd build
$ cmake ..
$ make

Ответ 2

Вы можете сделать это следующим образом.

  • CMakeLists.txt в вашем каталоге MainProject:

    project(MainProject)
    
    add_subdirectory(LibProject/src)
    add_subdirectory(MainProject/src)
    
  • CMakeLists.txt в вашем каталоге LibProject/src:

    include_directories(${PROJECT_SOURCE_DIR}/LibProject/inc/)
    add_library(LibProject test.cpp)
    
  • CMakeLists.txt в вашем каталоге MainProject/src:

    include_directories(${PROJECT_SOURCE_DIR}/MainProject/inc/)
    add_executable(MainProject main.cpp)
    target_link_libraries(MainProject LibProject)
    

Ответ 3

В моем случае я хотел сделать это с помощью одного CMakeList. И это сработало для меня. Я добавляю свое решение на случай, если оно кому-нибудь пригодится

Вот что я сделал в моем случае:

My structure:
Project
|CMakeLists.txt
|-src
| |*.cpp
| |*.c
|-include
| |*.hpp
| |*.h

Мой CMakeLists.txt состоит из основных частей:

include_directories(
        ${PROJECT_SOURCE_DIR}/include
        ${PROJECT_SOURCE_DIR}/src
)

^ Включает файлы .cpp для добавления заголовков в папку include.

file(GLOB all_SRCS
        "${PROJECT_SOURCE_DIR}/include/*.h"
        "${PROJECT_SOURCE_DIR}/include/*.hpp"
        "${PROJECT_SOURCE_DIR}/src/*.cpp"
        "${PROJECT_SOURCE_DIR}/src/*.c"
        )

^ Просто добавьте все, что находится в этих папках.

PS: если вы хотите увидеть полный CMakeLists.txt, перейдите по ссылке проекта NEGU93/ForbiddenDesert.