使用Cmake和Visual Studio 2013的未解析的外部

Adm*_*onB 3 c++ cmake unresolved-external sfml visual-studio-2013

我一直遇到使用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} )
Run Code Online (Sandbox Code Playgroud)

这是我简单的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;
}
Run Code Online (Sandbox Code Playgroud)

我正在为以下内容得到未解决的外部因素:

错误1错误LNK2019:未解析的外部符号"__declspec(dllimport)public:__ thishisall sf :: String :: String(char const*,class std :: locale const&)"(__ imp _ ?? 0String @sf @@ QAE @ PBDABVlocale @ std @@@ Z)在函数_main Z中引用:\ Coding\Game\VisualStudioProject\win32.obj win32

错误2错误LNK2019:解析外部符号 "__declspec(dllimport的)公共:__thiscall SF ::字符串::〜字符串(无效)"(__imp _ ?? 1String @ @@ SF QAE @ XZ)在函数引用_main Z:\编码\ Game\VisualStudioProject\win32.obj win32

错误3错误LNK2019:解析外部符号 "__declspec(dllimport的)公共:__thiscall SF :::视频模式:::视频模式(无符号整数,无符号整型,无符号整型)" 引用(__imp _ ?? 0VideoMode @ @@ SF QAE @ III @ Z)在函数_main Z:\ Coding\Game\VisualStudioProject\win32.obj win32

错误4错误LNK2019:未解析的外部符号"__declspec(dllimport)public:void __thiscall sf :: Window :: create(class sf :: VideoMode,class sf :: String const&,unsigned int,struct sf :: ContextSettings const&)在函数_main Z中引用了(__imp_?create @ Window @ sf @@ QAEXVVideoMode @ 2 @ ABVString @ 2 @ IABUContextSettings @ 2 @@ Z)Z:\ Coding\Game\VisualStudioProject\win32.obj win32

错误5错误LNK2019:无法解析的外部符号 "__declspec(dllimport的)市民:无效__thiscall SF ::窗口::关闭(无效)"(__imp_接近@窗口@ SF @@ QAEXXZ?)在函数引用_main Z:\编码\游戏\ VisualStudioProject\win32.obj win32

错误6错误LNK2019:无法解析的外部符号 "__declspec(dllimport的)市民:布尔__thiscall SF ::窗口:: pollEvent(类SF ::活动&)"(__imp_ pollEvent @窗口@ SF @@ QAE_NAAVEvent @ 2 @@ Z')在函数_main Z:\ Coding\Game\VisualStudioProject\win32.obj win32中引用

错误7错误LNK2019:无法解析的外部符号 "__declspec(dllimport的)市民:__thiscall SF :: RenderWindow的:: RenderWindow的(无效)"(__imp _ ?? 0RenderWindow @ SF @@ QAE @ XZ)中函数引用_main Z:\编码\游戏\ VisualStudioProject\win32.obj win32

错误8错误LNK2019:解析外部符号 "__declspec(dllimport的)公共:虚拟__thiscall SF :: RenderWindow的::〜RenderWindow的(无效)"(__imp _ ?? 1RenderWindow @ @@ SF UAE @ XZ)在函数_mainž引用:\编码\ Game\VisualStudioProject\win32.obj win32

错误9错误LNK1120:8个未解析的外部Z:\ Coding\Game\bin\Debug\win32.exe win32

我以前在Windows上使用过相同类型的脚本,在Windows上使用早期的VS成功(至少我记得我有)所以我认为这是VS 2013的新功能,但我完全被难倒了.

提前致谢.

注意:这是一个简单的例子.这种样式的CMakeLists.txt是由脚本生成的,因为它使用的主要代码库非常大(最初是基于Linux的,所以为什么'/'在任何地方使用).

Fra*_*ser 6

这看起来好像你没有成功地连接三个SFML库中的任何一个.

如果find_libraryCMakeLists.txt中的调用未能找到库,那么CMake将输出一个致命错误,我相信你已经提到了.

所以我最好的猜测是你试图链接64位版本的SFML库,而你的CMake命令指定32位版本.

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

cmake -G "Visual Studio 12 Win64" ..
Run Code Online (Sandbox Code Playgroud)

您需要清空构建文件夹以将生成器更改"Visual Studio 12""Visual Studio 12 Win64".

有关VS生成器的更多信息,请参阅文档.