2015-05-09 79 views
0

我想在Linux上使用CLion IDE,我正在迁移我的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

但是他的错误来自链接器...并且如果整个项目(用户部分)只包含一个源文件,我认为如果此源在移植到CLion/cmake之前用于构建精细,则无法将Player定义为未定义... – 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

'file(GLOB')的cmake文档暗示它不是正确的方法:“我们不推荐使用GLOB从源代码树中收集源文件列表。如果没有CMakeLists.txt文件在源文件被添加或删除,那么生成的构建系统无法知道何时要求CMake重新生成。“ - 尽管我已经在几个项目中看到了它,并且实际上它工作正常(只有开发者偶尔会惊讶于简单的'make'不是足够建立项目,在添加新文件之后) –

+0

也许这样你在目标中包含多个源文件?并且链接错误消失... – onqtam