Я пытаюсь использовать 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 под окнами?
Обратите внимание на '-lSDL2main' - перед связыванием с' SDL2' нужно связываться с 'SDL2main'. –
Ну, это было уже в правильном порядке в оригинальном вопросе, но в любом случае - только с GNU-компоновщиком. MSVC-компоновщик не заботится о порядке библиотеки. – keltar
Большое спасибо keltar! Решено! И спасибо, Иван, я подумал об этом, поэтому я вытащил заказ из ранее работающего сценария оболочки из старого проекта. – radcore