c++ - 当我尝试通过mingw将CMake与SFML库一起使用来编译项目时出错

标签 c++ cmake compiler-errors mingw sfml

当我想通过mingw(最后版本)使用带有CMML和SFML库的项目来编译项目时,我遇到了很多奇怪的错误(c++)。
CMake代码:

cmake_minimum_required(VERSION 3.0)

project(MLproject)

SET(CMAKE_SYSTEM_NAME    Windows)
SET(CMAKE_SYSTEM_VERSION 1)
SET(CMAKE_C_COMPILER     "i686-w64-mingw32-gcc")
SET(CMAKE_CXX_COMPILER   "i686-w64-mingw32-g++")
SET(CMAKE_RC_COMPILER    "i686-w64-mingw32-windres")
SET(CMAKE_RANLIB         "i686-w64-mingw32-ranlib")
set(CMAKE_CXX_STANDARD 17)

SET(CMAKE_FIND_ROOT_PATH "/usr/i686-w64-mingw32")
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

set(SOURCE_EXE src/main.cpp)

set(SOURCE_GAME
  src/Boss/Boss.cpp
  *...*
  src/Game/Game.cpp)

set(SOURCE_UI
  src/UI/ScrollBar/ScrollBar.cpp)

add_library(UI SHARED ${SOURCE_UI})
add_library(Game SHARED ${SOURCE_GAME})

add_executable(main ${SOURCE_EXE})

target_link_libraries(main Game UI
  sfml-graphics sfml-system sfml-windos sfml-audio)
错误:
CMakeFiles/UI.dir/src/UI/ScrollBar/ScrollBar.cpp.o:ScrollBar.cpp:(.text+0x6d): undefined reference to `_imp___ZN2sf14RectangleShapeC1ERKNS_7Vector2IfEE'
CMakeFiles/UI.dir/src/UI/ScrollBar/ScrollBar.cpp.o:ScrollBar.cpp:(.text+0x399): undefined reference to `_imp___ZN2sf12RenderStates7DefaultE.....
我该如何解决?我是否因为C++版本太旧而捕获错误? (所有内容都可以在Linux上成功编译,但是我想创建跨平台)

最佳答案

错误:

CMakeFiles/UI.dir/src/UI/ScrollBar/ScrollBar.cpp.o:ScrollBar.cpp:(.text+0x6d): undefined reference to `_imp___ZN2sf14RectangleShapeC1ERKNS_7Vector2IfEE'
表示UI库使用了一些SFML组件。但是,您仅将SFML库链接到main可执行文件,因此该库不知道这些SFML引用的定义位置。因此,您必须将任何相关的SFML库链接到UI目标:
target_link_libraries(UI PUBLIC sfml-graphics sfml-system sfml-windos sfml-audio)
在此处使用PUBLIC将SFML库传播到UI目标的使用者,例如main可执行文件。这消除了将它们显式链接到main的需要。这是您对这些更改的完整CMake:
cmake_minimum_required(VERSION 3.0)

project(MLproject)

# As commented, consider moving these calls to your toolchain file.
SET(CMAKE_SYSTEM_NAME    Windows)
SET(CMAKE_SYSTEM_VERSION 1)
SET(CMAKE_C_COMPILER     "i686-w64-mingw32-gcc")
SET(CMAKE_CXX_COMPILER   "i686-w64-mingw32-g++")
SET(CMAKE_RC_COMPILER    "i686-w64-mingw32-windres")
SET(CMAKE_RANLIB         "i686-w64-mingw32-ranlib")

SET(CMAKE_FIND_ROOT_PATH "/usr/i686-w64-mingw32")
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

set(CMAKE_CXX_STANDARD 17)

set(SOURCE_EXE src/main.cpp)

set(SOURCE_GAME
  src/Boss/Boss.cpp
  *...*
  src/Game/Game.cpp)

set(SOURCE_UI
  src/UI/ScrollBar/ScrollBar.cpp)

add_library(UI SHARED ${SOURCE_UI})
# Link SFML libraries to UI.
target_link_libraries(UI PUBLIC sfml-graphics sfml-system sfml-windos sfml-audio)

add_library(Game SHARED ${SOURCE_GAME})

add_executable(main ${SOURCE_EXE})

# Link Game and UI to the executable, which propagates the SFML libraries from UI also.
target_link_libraries(main PRIVATE Game UI)
请注意,CMake顶部的许多调用都属于工具链文件(如注释所示),通常是cross-compiling。我鼓励您通读文档以确定对它的需要,并了解如何设置它。

关于c++ - 当我尝试通过mingw将CMake与SFML库一起使用来编译项目时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62561063/

相关文章:

c++ - 识别 “Enter”

android - 构建 google breakpad android 示例错误

java - 变量未初始化,我不能将 null 用于 boolean 值

build - Jekyll甚至在排除后仍会删除文件夹引发关于帖子的构建警告

c# - 非静态字段、方法或属性需要对象引用

c++ - 无法编译使用 libxml++ 的简单程序,因为找不到 glibmmconfig.h

C++: "error C4430: missing type specifier - int assumed"对于构造函数和析构函数的无效声明

cmake - 在 Qt Creator 中使用 cmake-gui

cmake - 通过 FetchContent 安装 protobuf 时如何使用 cmake 命令 protobuf_generate?

c++ - CMake 错误 : Imported targets not available for Boost version 106300