【问题标题】:Link error with SFML library in CMake project on Windows [duplicate]Windows上CMa​​ke项目中的SFML库链接错误[重复]
【发布时间】:2020-10-09 03:42:06
【问题描述】:

我正在尝试在 Windows/MinGW 上构建一个 CMake 项目并将其链接到 SFML 2.5.1。 CMake 似乎找到了库,并且程序编译得很好,但是我收到了“未定义的引用”链接器错误。我关注了SFML 2.5 CMake build instructions。我错过了什么?

错误:

[ 50%] Linking CXX executable pressure.exe
CMakeFiles\pressure.dir/objects.a(main.cpp.obj): In function `main':
C:/code/cpp/small/pressure/main.cpp:19: undefined reference to `_imp___ZN2sf6StringC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6locale'
C:/code/cpp/small/pressure/main.cpp:19: undefined reference to `_imp___ZN2sf9VideoModeC1Ejjj'
C:/code/cpp/small/pressure/main.cpp:19: undefined reference to `_imp___ZN2sf12RenderWindowC1ENS_9VideoModeERKNS_6StringEjRKNS_15ContextSettingsE'
C:/code/cpp/small/pressure/main.cpp:21: undefined reference to `_imp___ZNK2sf6Window6isOpenEv'
C:/code/cpp/small/pressure/main.cpp:24: undefined reference to `_imp___ZN2sf6Window9pollEventERNS_5EventE'
C:/code/cpp/small/pressure/main.cpp:26: undefined reference to `_imp___ZN2sf6Window5closeEv'
C:/code/cpp/small/pressure/main.cpp:30: undefined reference to `_imp___ZN2sf5ColorC1Ehhhh'
C:/code/cpp/small/pressure/main.cpp:30: undefined reference to `_imp___ZN2sf12RenderTarget5clearERKNS_5ColorE'
C:/code/cpp/small/pressure/main.cpp:32: undefined reference to `_imp___ZN2sf6Window7displayEv'
C:/code/cpp/small/pressure/main.cpp:19: undefined reference to `_imp___ZN2sf12RenderWindowD1Ev'
C:/code/cpp/small/pressure/main.cpp:19: undefined reference to `_imp___ZN2sf12RenderWindowD1Ev'
collect2.exe: error: ld returned 1 exit status

我项目的 CMakeLists.txt:

cmake_minimum_required(VERSION 3.16)
project(pressure)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_VERBOSE_MAKEFILE ON)

if(WIN32)
#set(SFML_STATIC_LIBRARIES TRUE)
set(SFML_DIR C:/lib/cpp/SFML-2.5.1/lib/cmake/SFML)
endif()

set(SFML_LIBRARIES sfml-graphics sfml-audio)
set(pressure_VERSION_MAJOR 0)
set(pressure_VERSION_MINOR 1)
configure_file(
        "${PROJECT_SOURCE_DIR}/config.h.in"
        "${PROJECT_BINARY_DIR}/config.h"
)
include_directories("${PROJECT_BINARY_DIR}")

set(EXECUTABLE_NAME "pressure")
find_package(SFML 2.5 COMPONENTS system window graphics audio main network REQUIRED)
add_executable(pressure main.cpp)
target_link_libraries(${EXECUTABLE_NAME} ${SFML_LIBRARIES})

【问题讨论】:

  • 您能否提供详细的链接器输出,以便我们查看链接的内容?您可以尝试运行make VERBOSE=1 或类似的。
  • 另外,this 帖子中提到的非常相似的错误。也许,您可以查看那里的回复,看看它们是否适用于您的情况。具体来说,请确保您下载了正确的 MinGW 版本的 SFML,而不是 Visual Studio 版本。
  • @squareskittles 事实上,我正在尝试使用我为另一个项目下载的 Visual Studio 版本!它现在与 MinGW 32 位下载链接良好。

标签: cmake mingw linker-errors sfml


【解决方案1】:

这个错误在 Stack Overflow 网站上已经提到过几次了:

这种特定链接器错误通常会在 SFML 库与它们所链接的对象之间存在不兼容时发生 .从SFML 2.5.1 下载页面,有多个版本的 SFML 预构建库可用。确保下载并引用与 您的 编译器匹配的版本(例如 MinGW、Visual C++ 12、Visual C++ 15 等)。

在 Windows 上,支持几种不同的编译器;例如,如果您使用 Visual Studio 15 构建项目,请确保您已下载并引用了 Visual C++ 15 SFML 库。还要确保 SFML 库与编译器的架构相匹配(即 32 位或 64 位)。

如果您在 SFML 下载页面上提供的列表中没有看到您正在使用的编译器,您可以下载 SFML 源代码并使用您的编译器自行构建。这将有助于确保 SFML 库与您的项目具有二进制兼容性。或者,您可以浏览older versions 的 SFML 预构建库,看看其中是否有任何与您用于项目的编译器匹配。

【讨论】:

  • 您可能还会提到 Windows 上的 Visual Studio 与 MinGW 版本,因为它们适用于相同的操作系统,从而增加了混淆的可能性。
  • @voxoid 谢谢,我更新了回复以阐明 SFML 支持许多不同的基于 Windows 的编译器。
猜你喜欢
  • 1970-01-01
  • 2016-10-19
  • 2020-01-29
  • 2015-08-18
  • 1970-01-01
  • 2018-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多