【问题标题】:Error when I try to compile project using CMake with SFML library by mingw当我尝试使用 mingw 使用带有 SFML 库的 CMake 编译项目时出错
【发布时间】:2020-10-15 01:37:09
【问题描述】:

当我想通过 mingw(最新版本)使用 CMake 和 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下一切编译成功,但我想做跨平台)

【问题讨论】:

  • 如果您的UI 库(例如ScrollBar.cpp)也使用SFML,您必须将相关的SFML 库链接到UI 库:target_link_libraries(UI PUBLIC sfml-graphics sfml-system sfml-windos sfml-audio)跨度>
  • 哦,抱歉,我应该使用 STATIC 而不是 SHARED
  • 请注意,CMAKE_SYSTEM_NAMECMAKE_RANLIBCMAKE_FIND_ROOT_PATH 等设置通常用于toolchain files,而不是CMakeLists.txt。并设置例如CMAKE_SYSTEM_NAMEproject() 调用之后是完全错误的。

标签: c++ cmake compiler-errors mingw sfml


【解决方案1】:

错误:

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。我鼓励您通读文档以确定您对它的需求,并了解如何设置它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-21
    • 2014-11-02
    • 2017-09-10
    • 2018-03-05
    • 1970-01-01
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多