c++ - 使用 Cmake 和 Visual Studio 2013 Unresolved external 问题

标签 c++ visual-studio-2013 cmake sfml unresolved-external

我在使用 SFML 时遇到了 cmake 和 Visual Studio 2013 的问题。当我尝试编译我的程序时,对于使用 SFML 的所有内容,我都得到了未解析的外部信息。我在多台机器上遇到过这个问题,在某些情况下也遇到过其他一些库。

我正在使用以下命令生成我的 Visual Studio 项目(在 VisualStudioProject 文件夹中):

Z:/Coding/cmake/cmake-3.1.1-win32-x86/bin/cmake.exe -G "Visual Studio 12" ..

这是我的 CMakeLists.txt(它实际上是从我编写的 python 脚本生成的,但我怀疑这是否重要)。我可以确认已正确找到所有库。

cmake_minimum_required (VERSION 2.6)

set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin)
set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/lib )
set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/lib )

project(Game)

include_directories( Z:/Coding/Libraries/SFML/SFML-2.2/include Z:/Coding/Game/src/win32 Z:/Coding/Game/src )

find_library( SFML-GRAPHICS NAMES sfml-graphics PATHS Z:/Coding/Libraries/SFML/SFML-2.2/lib NO_DEFAULT_PATH )
find_library( SFML-WINDOW NAMES sfml-window PATHS Z:/Coding/Libraries/SFML/SFML-2.2/lib NO_DEFAULT_PATH )
find_library( SFML-SYSTEM NAMES sfml-system PATHS Z:/Coding/Libraries/SFML/SFML-2.2/lib NO_DEFAULT_PATH )

add_executable( win32 "Z:/Coding/Game/apps/win32.cpp" )
target_link_libraries( win32 ${SFML-GRAPHICS} ${SFML-WINDOW} ${SFML-SYSTEM} )

这是我的简单 SFML 测试程序:

#include <string>
#include <iostream>
#include <SFML/Graphics.hpp>

using namespace std;

int main(int argc, char *argv[])
{
    sf::RenderWindow window;
    window.create(sf::VideoMode(1280, 1024), "Test");

    while (true)
    {
        sf::Event ev;

        while (window.pollEvent(ev))
        {
            if (ev.type = sf::Event::EventType::Closed)
            {
                window.close();
                exit(1);
            }
        }
    }

    std::string hello = "Hello";
    cout << hello << endl;
}

我得到以下 Unresolved external 问题:

Error 1 error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall sf::String::String(char const *,class std::locale const &)" (__imp_??0String@sf@@QAE@PBDABVlocale@std@@@Z) referenced in function _main Z:\Coding\Game\VisualStudioProject\win32.obj win32

Error 2 error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall sf::String::~String(void)" (__imp_??1String@sf@@QAE@XZ) referenced in function _main Z:\Coding\Game\VisualStudioProject\win32.obj win32

Error 3 error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall sf::VideoMode::VideoMode(unsigned int,unsigned int,unsigned int)" (__imp_??0VideoMode@sf@@QAE@III@Z) referenced in function _main Z:\Coding\Game\VisualStudioProject\win32.obj win32

Error 4 error LNK2019: unresolved external symbol "__declspec(dllimport) public: void __thiscall sf::Window::create(class sf::VideoMode,class sf::String const &,unsigned int,struct sf::ContextSettings const &)" (__imp_?create@Window@sf@@QAEXVVideoMode@2@ABVString@2@IABUContextSettings@2@@Z) referenced in function _main Z:\Coding\Game\VisualStudioProject\win32.obj win32

Error 5 error LNK2019: unresolved external symbol "__declspec(dllimport) public: void __thiscall sf::Window::close(void)" (__imp_?close@Window@sf@@QAEXXZ) referenced in function _main Z:\Coding\Game\VisualStudioProject\win32.obj win32

Error 6 error LNK2019: unresolved external symbol "__declspec(dllimport) public: bool __thiscall sf::Window::pollEvent(class sf::Event &)" (__imp_?pollEvent@Window@sf@@QAE_NAAVEvent@2@@Z) referenced in function _main Z:\Coding\Game\VisualStudioProject\win32.obj win32

Error 7 error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall sf::RenderWindow::RenderWindow(void)" (__imp_??0RenderWindow@sf@@QAE@XZ) referenced in function _main Z:\Coding\Game\VisualStudioProject\win32.obj win32

Error 8 error LNK2019: unresolved external symbol "__declspec(dllimport) public: virtual __thiscall sf::RenderWindow::~RenderWindow(void)" (__imp_??1RenderWindow@sf@@UAE@XZ) referenced in function _main Z:\Coding\Game\VisualStudioProject\win32.obj win32

Error 9 error LNK1120: 8 unresolved externals Z:\Coding\Game\bin\Debug\win32.exe win32

我以前在 Windows 上使用过与 SFML 相同的脚本样式,在早期的 VS 上成功使用过(至少我记得我用过)所以我认为这是 VS 2013 的新事物,但我完全被难住了.

提前致谢。

注意:这是一个简单的示例。这种风格的 CMakeLists.txt 是由脚本生成的,因为它使用的主要代码库非常大(最初是基于 Linux 的,因此为什么到处都使用“/”)。

最佳答案

这看起来确实像是您实际上没有成功链接三个 SFML 库中的任何一个。

如果 CMakeLists.txt 中的 find_library 调用未能找到库,那么 CMake 将输出一个 fatal error ,我相信您已经提到过。

所以我最好的猜测是您正在尝试链接 SFML 库的 64 位版本,而您的 CMake 命令指定了 32 位版本。

要创建 64 位版本,只需运行:

cmake -G "Visual Studio 12 Win64" ..

您需要清空构建文件夹以将生成器从 “Visual Studio 12” 更改为 “Visual Studio 12 Win64”

参见 the docs有关 VS 生成器的更多信息。

关于c++ - 使用 Cmake 和 Visual Studio 2013 Unresolved external 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28246223/

相关文章:

gcc - cmake if 测试 GCC

c++ - CMake 中的更新选项(Make 文件)

c++ - 链接器设置

visual-studio-2013 - 用数据文件替换记录值 - 数据驱动测试

c++ - 如何以稳定的方式进行部分排序

visual-studio - 从 Visual Studio 中删除所有快捷键

c++ - 如何为 VC++ 2013 安装平台工具集

linux - 如何启用 vtk "direct"硬件渲染,X11/Ubuntu 11.04 x86-64?

c++ - 异常处理

c++ - 排序/操作/排序的最佳替代算法