Как сделать 2 разных исполняемых файла, используя 2 разных основных файла. cpp при использовании CMake только один раз? - PullRequest
0 голосов
/ 02 марта 2020

У меня есть графический проект, который требует 2d редактора и 3d редактора. У меня есть отдельный файл main.cpp для каждого, содержащий код для запуска программы. Как получить два разных исполняемых файла, когда я запускаю cmake .., а затем make? Нужно ли что-то добавить в файл CMakeLists.txt?

Это файл CMakeLists.txt, который у меня есть:

cmake_minimum_required(VERSION 2.8.12)
project(Assignment2)

### Output directories
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")

### Compilation flags: adapt to your needs ###
if(MSVC)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP /bigobj") ### Enable parallel compilation
  set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR} )
  set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR} )
else()
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
endif()

### Add src to the include directories
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/src")

### Include Eigen for linear algebra
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/ext/eigen")

### Compile GLFW3 statically
set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL " " FORCE)
set(GLFW_BUILD_TESTS OFF CACHE BOOL " " FORCE)
set(GLFW_BUILD_DOCS OFF CACHE BOOL " " FORCE)
set(GLFW_BUILD_INSTALL OFF CACHE BOOL " " FORCE)
add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/ext/glfw" "glfw")
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/ext/glfw/include")
set(LIBRARIES "glfw" ${GLFW_LIBRARIES})

### On windows, you also need glew
if((UNIX AND NOT APPLE) OR WIN32)
  set(GLEW_INSTALL OFF CACHE BOOL " " FORCE)
  add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/ext/glew" "glew")
  include_directories("${CMAKE_CURRENT_SOURCE_DIR}/ext/glew/include")
  list(APPEND LIBRARIES "glew")
endif()

### Compile all the cpp files in src
file(GLOB SOURCES
"${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp"
)

add_executable(${PROJECT_NAME}_bin ${SOURCES})
target_link_libraries(${PROJECT_NAME}_bin ${LIBRARIES})

1 Ответ

1 голос
/ 02 марта 2020

Как прокомментировано, если вам нужны два исполняемых файла, вы должны вызвать команду add_executable() дважды . Поскольку у вас есть два основных файла. cpp, вы можете вызывать add_executable() для каждого, добавляя при этом остальные оставшиеся исходные файлы в оба исполняемых файла.

Кроме того, использование команды file(GLOB ...) не рекомендуется, поскольку CMake не может отслеживать изменения в вашем наборе исходных файлов. Вместо этого вы должны перечислить ваши исходные файлы по отдельности. Ваш CMake может выглядеть примерно так:

set(SOURCES
    ${CMAKE_CURRENT_SOURCE_DIR}/src/MyClass1.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/src/MyClass2.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/src/MyHelperFunctions.cpp
)

# Call add_executable() for each main.cpp file.
add_executable(${PROJECT_NAME}_bin_2d 
    ${SOURCES}
    main_2d.cpp
)
add_executable(${PROJECT_NAME}_bin_3d 
    ${SOURCES}
    main_3d.cpp
)
target_link_libraries(${PROJECT_NAME}_bin_2d ${LIBRARIES})
target_link_libraries(${PROJECT_NAME}_bin_3d ${LIBRARIES})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...