当我尝试通过 mingw 使用带有 SFML 库的 CMake 编译项目时出错
Error when I try to compile project using CMake with SFML library by mingw
当我想通过 mingw(最后一个版本)使用带有 SFML 库的 CMake 编译项目时,我发现了很多奇怪的错误 (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组件。但是,您只 link SFML 库到 main
可执行文件,所以库不知道这些 SFML 引用在哪里定义。因此,您必须 link 任何相关的 SFML 库到 UI
目标:
target_link_libraries(UI PUBLIC sfml-graphics sfml-system sfml-windos sfml-audio)
在此处使用 PUBLIC
将 SFML 库传播到 UI
目标的 消费者 ,例如您的 main
可执行文件。这消除了将它们显式 link 到 main
的需要。这是您的完整 CMake,其中包含这些更改:
cmake_minimum_required(VERSION 3.0)
project(MLproject)
# As commented, consider moving these calls to your toolchain file.
<s>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")</s>
<s>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)</s>
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)
</pre>
请注意,CMake 顶部的许多调用都属于工具链文件(如评论所述),通常用于 cross-compiling。我鼓励您通读文档以确定您对它的需求,并了解如何设置它。
当我想通过 mingw(最后一个版本)使用带有 SFML 库的 CMake 编译项目时,我发现了很多奇怪的错误 (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组件。但是,您只 link SFML 库到 main
可执行文件,所以库不知道这些 SFML 引用在哪里定义。因此,您必须 link 任何相关的 SFML 库到 UI
目标:
target_link_libraries(UI PUBLIC sfml-graphics sfml-system sfml-windos sfml-audio)
在此处使用 PUBLIC
将 SFML 库传播到 UI
目标的 消费者 ,例如您的 main
可执行文件。这消除了将它们显式 link 到 main
的需要。这是您的完整 CMake,其中包含这些更改:
cmake_minimum_required(VERSION 3.0) project(MLproject) # As commented, consider moving these calls to your toolchain file. <s>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")</s> <s>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)</s> 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) </pre>
请注意,CMake 顶部的许多调用都属于工具链文件(如评论所述),通常用于 cross-compiling。我鼓励您通读文档以确定您对它的需求,并了解如何设置它。