c++ - 尝试包含我的源文件的 CMake 问题

标签 c++ cmake sfml clion

我正在尝试在 Linux 上使用 CLion IDE,并且正在迁移我的 SFML 应用程序。它坚持要我使用我目前遇到问题的 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 中没有问题

最佳答案

两个建议

我不确定您打算如何处理包含路径。我的猜测是这是一些实验遗留下来的。您已经告诉 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 编译它会更好。

关于c++ - 尝试包含我的源文件的 CMake 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30140882/

相关文章:

c++ - std::vector of function pointers:不同的模板参数

c++ - 如何枚举进程中所有命名管道的名称?

c++ - Visual Studio 2017 中的 sfml 静态链接错误

c++ - 我正在尝试在我的 SFML Platformer 中实现双跳,但它没有按预期方式工作

c++ - 使用像素阵列在 SFML 中操作图像

c++ - 将公共(public)接口(interface)与实现细节分开

c++ - 在 *nix 上了解异步编程的基础知识

opencv - OpenCV:在Windows 7上构建库期间,cmake失败

python - CMake在Python Virtualenv中安装DLib时找不到C和C++编译器

permissions - CMake : how to create a directory during installation with certain access rights?