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

У меня были проблемы с cmake и Visual Studio 2013 с SFML. Когда я пытаюсь скомпилировать свою программу, я получаю неразрешенные внешние элементы для всего, что использует 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;
}

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

Ошибка 1 ошибка LNK2019: неразрешенный внешний символ «__declspec (dllimport) public: __thiscall 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) public: __thiscall sf :: String :: ~ String (void)» (__imp _ ?? 1String @ sf @@ QAE @ XZ), на который имеется ссылка в функции _main Z: \ Coding \ Игра \ 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 (class sf :: VideoMode, class sf :: String const &, unsigned 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 \ Игра \ VisualStudioProject \ win32.obj win32

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

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

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

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


person AdmiralJonB    schedule 30.01.2015    source источник


Ответы (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.

person Fraser    schedule 31.01.2015
comment
Кажется, вы правы. Спасибо. Это будет интересное изменение в моем скрипте сборки ... - person AdmiralJonB; 31.01.2015

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

Попробуй бежать

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, но иногда вам нужно заставить его выбрать правильный вариант.

person KidneyChris    schedule 31.01.2015
comment
+1, но я думаю, что CMake всегда по умолчанию будет использовать win32, если вы не укажете Win64 в генераторе или не передадите -Ax64 в командной строке. - person Fraser; 31.01.2015
comment
Кажется, вы правы. Спасибо, но другой ответ читается немного лучше. - person AdmiralJonB; 31.01.2015
comment
Я согласен, что ответ @ Fraser читается лучше. По-видимому, они действительно знают, что делают, в отличие от моего Эх, это, вероятно, проблема с 64-битной связкой :-) - person KidneyChris; 31.01.2015