2015-05-09 3 views
0

Я пытаюсь использовать CLI IDE в Linux, и я переношу приложение SFML. Он настаивает, что я использую CMake, с которым у меня возникают проблемы.Проблемы с CMake при попытке включить мои исходные файлы

cmake_minimum_required(VERSION 2.6) 
project(SFML2) 


include_directories("${PROJECT_BINARY_DIR} src/") 
include_directories("${YOUR_DIRECTORY} src") 

# Define sources and executable 
set(EXECUTABLE_NAME "SFML") 
add_executable(${EXECUTABLE_NAME} src/SFML.cpp) 


# Detect and add SFML 
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake_modules"  
${CMAKE_MODULE_PATH}) 

find_package(SFML 2 REQUIRED system window graphics network audio) 
target_link_libraries(${EXECUTABLE_NAME} ${SFML_LIBRARIES}) 

# Install target 
install(TARGETS ${EXECUTABLE_NAME} DESTINATION bin) 


# CPack packaging 
include(InstallRequiredSystemLibraries) 

Однако я получаю ошибки построения

CMakeFiles/SFML.dir/src/SFML.cpp.o: In function `main': 
SFML.cpp:(.text+0xca): undefined reference to `Game::Game()' 
SFML.cpp:(.text+0xd9): undefined reference to `Game::run()' 
CMakeFiles/SFML.dir/src/SFML.cpp.o: In function `Game::~Game()': 
SFML.cpp:(.text._ZN4GameD2Ev[_ZN4GameD5Ev]+0xa2): undefined reference to `Player::~Player()' 
SFML.cpp:(.text._ZN4GameD2Ev[_ZN4GameD5Ev]+0xb4): undefined reference to `Player::~Player()' 
SFML.cpp:(.text._ZN4GameD2Ev[_ZN4GameD5Ev]+0x18b): undefined reference to `Player::~Player()' 
SFML.cpp:(.text._ZN4GameD2Ev[_ZN4GameD5Ev]+0x1a2): undefined reference to `Player::~Player()' 
collect2: error: ld returned 1 exit status 
CMakeFiles/SFML.dir/build.make:90: recipe for target 'SFML' failed 
make[2]: *** [SFML] Error 1 
CMakeFiles/Makefile2:60: recipe for target 'CMakeFiles/SFML.dir/all' failed 
make[1]: *** [CMakeFiles/SFML.dir/all] Error 2 
Makefile:136: recipe for target 'all' failed 
make: *** [all] Error 2 

Ссылка Игра находится в том же месте, что и SFML.cpp, который где все запускается с.

Это в настоящее время работает без проблем в Eclipse CDT

ответ

1

Два предложения

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

include_directories("${PROJECT_BINARY_DIR} src/") 
include_directories("${YOUR_DIRECTORY} src") 

Я не уверен, где определены эти переменные, но, возможно, вы имели в виду это

include_directories(src) 

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

add_exectuable(${EXECUTABLE_NAME} 
     src/SFML.cpp 
     src/SFML.h 
     src/other.cpp 
     src/other.h 
    # and so on 
) 

Добавление файлов заголовков не требуется, но это делает его приятным, если вы когда-либо компилируете это с помощью Visual Studio.

+0

, но его ошибки взяты из компоновщика ... И если весь проект (пользовательская часть) состоит только из одного исходного файла, я не вижу, чтобы Player был неопределенным, если этот источник использовался для создания штрафа, прежде чем перейти к CLion/cmake ... – onqtam

+0

Его ошибки связаны с компоновщиком, но единственное различие заключается в том, что до того, как у него был один исходный файл, и после того, как у него был тот же исходный файл и все другие имена без названия в папке 'src'. Поэтому должен быть какой-то исходный код, который ему нужен из 'src'. –

0

Просто обновление для тех, кто еще кого может наткнуться на эту проблему. Я редактировал эти несколько строк в мой код

# Define sources and executable 
set(EXECUTABLE_NAME "SFML") 

file(GLOB SRC 
    "src/*.h" 
    "src/*.cpp" 
) 

add_executable(${EXECUTABLE_NAME} ${SRC}) 

похоже на работу сейчас, кто может подтвердить, что это правильный способ сделать это?

+1

Документация cmake для 'file (GLOB) предполагает, что это неправильный способ:« Мы не рекомендуем использовать GLOB для сбора списка исходных файлов из исходного дерева. Если файл CMakeLists.txt не изменяется, когда источник добавляется или удаляется, тогда сгенерированная система сборки не может знать, когда спросить CMake для регенерации ». - хотя я видел это в нескольких проектах, и на практике он отлично работает (только разработчики иногда удивляются, когда простой' make' не достаточно, чтобы создать проект, после добавления новых файлов). –

+0

Возможно ли это, что вы включаете более одного исходного файла в цель? и ошибки ссылок уходят ... – onqtam

Смежные вопросы