Создать CMakeFiles.txt для новичков

У меня есть проект со следующей структурой

  /cmake_modules/
FindSFML.cmake
/includes/
car.hpp
motor.hpp
tires.hpp
/sources/
car.cpp
motor.cpp
tires.cpp
/main.cpp
/main.hpp

У меня есть следующее CMakeFiles.txt

cmake_minimum_required(VERSION 2.8)

project (MYGAME)
set (MYGAME_VERSION_MAJOR 1)
set (MYGAME_VERSION_MINOR 0)

set (EXECUTABLE_NAME "mygame")

include_directories ("${MYGAME_BINARY_DIR}")
include_directories ("${MYGAME_BINARY_DIR}/includes")
link_directories ("${MYGAME_BINARY_DIR}/sources")

add_executable(${EXECUTABLE_NAME} main.cpp)

set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake_modules" ${CMAKE_MODULE_PATH})
find_package(SFML 2.0 REQUIRED system window graphics network audio)

target_link_libraries(${EXECUTABLE_NAME} ${SFML_LIBRARIES})

Когда я пытаюсь выполнить make я понял

[100%] Building CXX object CMakeFiles/mygame.dir/main.cpp.o
Linking CXX executable mygame
CMakeFiles/mygame.dir/main.cpp.o: In function `main':
main.cpp:(.text+0x11): undefined reference to `mynamespace::Car::Instance()'
main.cpp:(.text+0x21): undefined reference to `mynamespace::Car::start()'
collect2: error: ld returned 1 exit status
make[2]: *** [mygame] Error 1
make[1]: *** [CMakeFiles/mygame.dir/all] Error 2
make: *** [all] Error 2

Как это исправить

2

Решение

Вам нужно каким-то образом включить остальные сборки (car.cpp, motor.cpp и tyres.cpp) в сборку.

Вы можете добавить их вместе с main.cpp в исполняемый файл напрямую:

set(MySources sources/car.cpp sources/motor.cpp sources/tires.cpp main.cpp)
add_executable(${EXECUTABLE_NAME} ${MySources})

или вы можете сделать это в библиотеке и связать это:

set(MyLibSources sources/car.cpp sources/motor.cpp sources/tires.cpp)
add_library(MyLib ${MyLibSources})
add_executable(${EXECUTABLE_NAME} main.cpp)
...
target_link_libraries(${EXECUTABLE_NAME} MyLib ${SFML_LIBRARIES})

Еще пара моментов, на которые стоит обратить внимание:

Вы должны избегать использования link_directories если возможно (его собственная документация препятствует его использованию), и часто бывает полезно включить заголовки в список файлов, добавленных с помощью add_executable или же add_library так как они затем отображаются в IDE, таких как MS Visual Studio.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]