如何正确静态链接SFML?(Clion、CMake、Windows 10 x64)

How to correctly link SFML staticly? (Clion, CMake, Windows 10 x64)

提问人:Kyrbyn YT 提问时间:4/18/2023 更新时间:4/21/2023 访问量:268

问:

我正在使用 CMake 静态链接 SFML,并且我收到所有 SFML 类或方法的未定义引用错误。 CmakeLists.txt(SFML位于同一目录中,并且是x64):

cmake_minimum_required(VERSION 3.22)
project(YeOldFlapper)

add_definitions(-DSFML_STATIC)

set(SFML_INCLUDE_DIR "SFML/include")
set(SFML_LIB_DIR "SFML/lib")
set(CMAKE_CXX_STANDARD 14)

include_directories(${SFML_INCLUDE_DIR})
link_directories(${SFML_LIB_DIR})


add_executable(YeOldFlapper main.cpp)

target_link_libraries(YeOldFlapper sfml-graphics-s sfml-window-s sfml-system-s)

main.cpp

#include <SFML/Graphics.hpp>

namespace SFML = sf;

int main() {
    SFML::RenderWindow window(SFML::VideoMode(500, 500), "SFML WORKS!!!");

    while(window.isOpen()){
        SFML::Event event;
        while(window.pollEvent(event)){
            switch (event.type) {
                case SFML::Event::Closed:
                    window.close();
                    break;
            }
        }

        window.clear();
        window.display();
    }


    return 0;
}

我链接得很好,但我得到了未定义的引用。

C++ CMake SFML 未定义引用

评论

1赞 Cosemuckel 4/18/2023
从 SFML 2.2 开始,在静态链接时,还必须将 SFML 的所有依赖项链接到您的项目。这意味着,如果您要链接 sfml-window-s.lib 或 sfml-window-s-d.lib,您还必须链接 opengl32.lib、winmm.lib 和 gdi32.lib。
0赞 Kyrbyn YT 4/18/2023
好吧,我将 CmakeLists.txt target_link_libraries更改为,但仍然抛出相同的错误target_link_libraries(YeOldFlapper opengl32 winmm gdi32 sfml-graphics-s sfml-window-s sfml-system-s)
0赞 orhtej2 4/18/2023
你能发布错误吗?根据文档和这个答案我认为你应该通过而不是.-lsfml-graphics-ssfml-graphics-s
0赞 Kyrbyn YT 4/18/2023
基本上,所有 sfml 调用都是这样:C:\Program Files\JetBrains\CLion 2022.1\bin\mingw\bin/ld.exe: C:/Users/Mokykla/CLionProjects/SFML/Projects/YeOldFlapper/main.cpp:7: undefined reference to `sf::RenderWindow::RenderWindow(sf::VideoMode, sf::String const&, unsigned int, sf::ContextSettings const&)'
0赞 drescherjm 4/18/2023
您是否正在链接为 MinGW 编译的二进制文件?是扩展而不是?MinGW 二进制文件应该具有静态库的扩展。MSVC 应具有.a.lib.a.lib

答:

0赞 Kyrbyn YT 4/18/2023 #1

OP 发现看到的链接问题是由于他混淆了他认为他正在链接的库。他以为自己正在与 MING32 SFML 链接,但发现他试图与 VC SFML 链接。

SFML 和 CMake 的文档可在此处找到:https://www.sfml-dev.org/tutorials/2.5/compile-with-cmake.php