Неразрешенные внешние проблемы с использованием Cmake и Visual Studio 2013

У меня были проблемы с cmake и Visual Studio 2013 с SFML. Когда я пытаюсь скомпилировать свою программу, я получаю неразрешенные внешние данные для всего, что использует SFML. У меня были проблемы с этим на нескольких машинах, а также с некоторыми другими библиотеками в некоторых случаях.

Я использую следующую команду для генерации моего проекта Visual Studio (внутри папки Visual Studio Project):

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;
}

И я получаю неразрешенные внешние данные для следующего:

Ошибка 1 ошибка LNK2019: неразрешенный внешний символ "__declspec(dllimport) public: __thiscall sf::String::String(char const *, класс std::locale const &)" (__imp_??0String@sf@@QAE@PBDABVlocale@std@@@Z) ссылка на функцию _main Z:\Coding\Game\VisualStudioProject\win32.obj win32

Ошибка 2 ошибка LNK2019: неразрешенный внешний символ "__declspec(dllimport) public: __thiscall sf::String::~String(void)" (__imp_??1String@sf@@QAE@XZ), на который есть ссылка в функции _main Z:\Coding\Game\VisualStudioProject\win32.obj win32

Ошибка 3 ошибка LNK2019: неразрешенный внешний символ "__declspec(dllimport) public: __thiscall sf::VideoMode::VideoMode(unsigned int,unsigned int,unsigned int)" (__imp_??0VideoMode@sf@@QAE@III@Z) ссылается в функции _main Z:\Coding\Game\VisualStudioProject\win32.obj win32

Ошибка 4 ошибка LNK2019: неразрешенный внешний символ "__declspec(dllimport) public: void __thiscall sf::Window::create(класс sf::VideoMode, класс sf::String const &, без знака int,struct sf::ContextSettings const &)" (__imp_?create@Window@sf@@QAEXVVideoMode@2@ABVString@2@IABUContextSettings@2@@Z) ссылка на функцию _main Z:\Coding\Game\VisualStudioProject\win32.obj win32

Ошибка 5, ошибка LNK2019: неразрешенный внешний символ "__declspec(dllimport) public: void __thiscall sf::Window::close(void)" (__imp_? Close@Window@sf@@QAEXXZ), на который есть ссылка в функции _main Z:\Coding\Game\VisualStudioProject\win32.obj win32

Ошибка 6 ошибка LNK2019: неразрешенный внешний символ "__declspec(dllimport) public: bool __thiscall sf::Window::pollEvent(class sf::Event &)" (__imp_? PollEvent@Window@sf@@QAE_NAAVEvent@2@@Z) ссылка в функции _main Z:\Coding\Game\VisualStudioProject\win32.obj win32

Ошибка 7, ошибка LNK2019: неразрешенный внешний символ "__declspec(dllimport) public: __thiscall sf::RenderWindow::RenderWindow(void)" (__imp_??0RenderWindow@sf@@QAE@XZ), на который есть ссылка в функции _main Z:\Coding\Game\VisualStudioProject\win32.obj win32

Ошибка 8, ошибка LNK2019: неразрешенный внешний символ "__declspec(dllimport) public: virtual __thiscall sf::RenderWindow::~RenderWindow(void)" (__imp_??1RenderWindow@sf@@UAE@XZ), на который есть ссылка в функции _main Z:\Coding\Game\VisualStudioProject\win32.obj win32

Ошибка 9 Ошибка LNK1120: 8 неразрешенных внешних Z:\Coding\Game\bin\Debug\win32.exe win32

Ранее я использовал этот же стиль сценария с SFML в прошлом на Windows с более ранней версией VS успешно (по крайней мере, я помню, у меня есть), так что я думаю, что это новая вещь с VS 2013, но я совершенно ошеломлен.

Заранее спасибо.

Примечание. Это упрощенный пример. Этот стиль CMakeLists.txt генерируется скриптом, потому что основная кодовая база, на которой он используется, очень велика (изначально основана на Linux, поэтому почему / используются везде).

2 ответа

Решение

Это, безусловно, выглядит так, как будто вы не связали ни одну из трех библиотек SFML успешно.

Если find_library вызовам в CMakeLists.txt не удалось найти библиотеки, а затем CMake выдаст фатальную ошибку, о которой вы наверняка упоминали.

Поэтому я думаю, что вы пытаетесь связать 64-битную версию библиотек SFML, в то время как ваша команда CMake задает 32-битную сборку.

Чтобы создать 64-битную сборку, просто запустите:

cmake -G "Visual Studio 12 Win64" ..

Вам нужно очистить папку сборки, чтобы изменить генератор "Visual Studio 12" в "Visual Studio 12 Win64",

См. Документы для получения дополнительной информации о генераторе VS.

Ударить в темноте:

Попробуйте запустить

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

Это заставит его выполнять все соединения в 64-битной среде. Я предполагаю, что вы используете 64-битный компьютер. Я также предполагаю, что у вас есть 64-битная версия SFML. (Это будущее, я думаю, это безопасные предположения).

CMake попытается выбрать "разумное" значение по умолчанию в соответствии с http://www.cmake.org/cmake/help/v3.0/generator/Visual%20Studio%2012%202013.html но иногда вы хотите заставить его выбрать правильный вариант.

Другие вопросы по тегам