2016-10-05 1 views
2

Я пытаюсь использовать clang для Windows для компиляции и связывания приложения SDL2.Ошибка при связывании SDL2 с использованием Clang в Windows «LNK1561: точка входа должна быть определена»

Причина этого заключается в том, чтобы попытаться сохранить мою среду разработки в соответствии с другими членами команды, которые используют OSX с XCode (компиляция с clang). Поскольку компилятор Visual C++ гораздо менее строг, чем компилятор clang, я могу потенциально совершать изменения, которые не будут компилироваться под clang.

Я предпочел бы не иметь, чтобы установить VS 2015, чтобы использовать экспериментальную среду LLVM сборки: (ссылка удалена)

Я установил LLVM/Clang инструменты на окнах (не построены из источника, только загруженные двоичные файлы из здесь: (ссылка удалена)) и может успешно создать и запустить консольное приложение «hello world», используя clang.

Что бы я хотел сделать, это иметь командный файл, который позволяет мне периодически создавать и связывать с clang, чтобы убедиться, что мой код будет безопасным для совершения.

При компоновке даже простое приложение SDL2 одного файла, я получаю следующее сообщение об ошибке компоновщика:

LINK : fatal error LNK1561: entry point must be defined 
clang++.exe: error: linker command failed with exit code 1561 (use -v to see invocation) 

Эта нить предполагает установки компоновщика Subsystem SDL2: LNK1561: entry point must be defined хотя я не уверен, как это сделать, что при компиляции из командная строка. Насколько я понимаю, значение по умолчанию должно быть CONSOLE, если не указано.

Моя главная функция точки входа в виде междунар основного (интермедиат ARGC, символ * ARGV []), как в этой теме: Why SDL defines main macro?

Вот файл летучая Я использую:

CALL "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\vcvars32.bat" 
clang++ -std=c++11 main.cpp -I./include/SDL2 -L./lib -lSDL2main -lSDL2 

Входящие и библиотечные каталоги верны, насколько я могу судить. Компилятор может найти библиотеки, и компилятор может видеть включенные файлы.

Чтобы не усложнять код, я использую для тестирования компилятора/линкера был вытянут прямо из вводного учебника ленивого Foo нашел здесь: http://lazyfoo.net/tutorials/SDL/01_hello_SDL/index2.php

/*This source code copyrighted by Lazy Foo' Productions (2004-2015) 
and may not be redistributed without written permission.*/ 

//Using SDL and standard IO 
#include <SDL.h> 
#include <stdio.h> 

//Screen dimension constants 
const int SCREEN_WIDTH = 640; 
const int SCREEN_HEIGHT = 480; 

int main(int argc, char* args[]) 
{ 
    //The window we'll be rendering to 
    SDL_Window* window = NULL; 

    //The surface contained by the window 
    SDL_Surface* screenSurface = NULL; 

    //Initialize SDL 
    if(SDL_Init(SDL_INIT_VIDEO) < 0) 
    { 
     printf("SDL could not initialize! SDL_Error: %s\n", SDL_GetError()); 
    } 
    else 
    { 
     //Create window 
     window = SDL_CreateWindow("SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN); 
     if(window == NULL) 
     { 
      printf("Window could not be created! SDL_Error: %s\n", SDL_GetError()); 
     } 
     else 
     { 
      //Get window surface 
      screenSurface = SDL_GetWindowSurface(window); 

      //Fill the surface white 
      SDL_FillRect(screenSurface, NULL, SDL_MapRGB(screenSurface->format, 0xFF, 0xFF, 0xFF)); 

      //Update the surface 
      SDL_UpdateWindowSurface(window); 

      //Wait two seconds 
      SDL_Delay(2000); 
     } 
    } 

    //Destroy window 
    SDL_DestroyWindow(window); 

    //Quit SDL subsystems 
    SDL_Quit(); 

    return 0; 
} 

Кто-нибудь знает, почему я бы получать этот линкер ошибка при связывании SDL с использованием clang под окнами?

ответ

3

MSVC компоновщик использует /subsystem:windows возможность установить графический режим (и использовать WinMain вместо main), так что вам нужно, чтобы передать его:

clang++ -std=c++11 main.cpp -I./include/SDL2 -L./lib -lSDL2main -lSDL2 -Xlinker /subsystem:windows 
+0

Обратите внимание на '-lSDL2main' - перед связыванием с' SDL2' нужно связываться с 'SDL2main'. –

+0

Ну, это было уже в правильном порядке в оригинальном вопросе, но в любом случае - только с GNU-компоновщиком. MSVC-компоновщик не заботится о порядке библиотеки. – keltar

+0

Большое спасибо keltar! Решено! И спасибо, Иван, я подумал об этом, поэтому я вытащил заказ из ранее работающего сценария оболочки из старого проекта. – radcore

0

LINK : fatal error LNK1561: entry point must be defined clang++.exe: error: linker command failed with exit code 1561 (use -v to see invocation)

Это обычно происходит, когда у вас нет a main(...) функция.

SDL «крадет» основную функцию, поэтому ваш int main(int, argc[]*) на самом деле не является точкой входа.

Точка входа определяется в SDL2main.lib. Вы должны сообщить линкеру clang, чтобы связаться с ним. (Примечание: необходимо связать с SDL2main перед тем SDL2.)

отметить также, что везде, где вы определяете main(...) функцию, вы должны #include "SDL.h".

+0

Спасибо, Иван, я столкнулся с этими проблемами раньше, но на этот раз это было не так. Мне не удалось явно указать подсистему для компоновщика (см. Ответ кельтара выше) – radcore

Смежные вопросы