2016-10-05 10 views
2

エラー時にWindows上でクランを使用してSDL2のリンク「LNK1561:エントリポイントが定義されなければならない」私はSDL2アプリケーションをコンパイルしてリンクするには、Windows上で打ち鳴らすを使用しようとしています

この理由は、試してみてはXCode(打ち鳴らすでコンパイル)とOSXを使用している他のチームメンバーとの一貫性の私の開発環境を維持することです。 Visual C++コンパイラはclangコンパイラよりもはるかに厳密ではないので、clangでコンパイルされない変更をコミットする可能性があります。

私は環境を構築実験LLVMを使用するようにVS 2015をインストールする必要がないことを好むだろう:(リンクは削除)

私はLLVM /打ち鳴らすのソースから構築されていないWindows上のツール(、単にダウンロードしたバイナリからインストールされています(リンクは削除されました))、clangを使って "hello world"コンソールアプリケーションを構築して実行することができます。私がやりたい何

は、私は私のコードがコミットするのが安全だろうことを確認するために構築し、定期的に打ち鳴らすとリンクすることを可能にするバッチファイルを持つことです。

も、単純な単一のファイル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) 

このスレッドは私がからコンパイルするときにそれを行うかどうかはわかりませんが、リンカサブシステムSDL2: LNK1561: entry point must be definedを設定示唆コマンドライン。私が理解しているように、指定されていない場合のデフォルトはCONSOLEです。

私のメインのエントリポイント関数は、メインフォームのint型である(int型のargc、char型*のARGV [])このスレッドごとのように:

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 
:ここ

Why SDL defines main macro?は、私が使用していますbatファイルであります

私が知る限り、includeとlibraryディレクトリは正しいです。リンカーはライブラリを見つけることができ、コンパイラはインクルードファイルを見ることができます。

物事をシンプルに保つために、私は、コンパイラ/リンカをテストするために使用していたコードはここで見つける怠惰、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; 
} 

私はこのリンカを受けることになる、なぜ誰もが知っていますWindows下でclangを使用してSDLをリンクするとエラーが発生しますか?あなたが持っていないとき

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

答えて

3

MSVCリンカーは、GUIモードを設定する(そして代わりにmainWinMainを使用)する/subsystem:windowsオプションを使用していますmain(...)機能です。あなたのint main(int, argc[]*)が本当にエントリポイントではありませんので

SDLは、主な機能を「盗みます」。

エントリポイントは、SDL2main.libに定義されています。 clangのリンカにリンクする必要があります。 (注:の前にSDL2とリンクする必要があります)

main(...)機能を定義する場合は、必ず#include "SDL.h"にする必要があります。

+0

'-lSDL2main'に注目してください。 - SDL2mainとリンクする前に、' 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)

これは通常起こります:あなたはそれを渡す必要がありますので

+0

ありがとうございましたIvan、私は以前にそれらの問題にぶつかりましたが、今回はそうではありませんでした。私は、リンカーが使用するサブシステムを明示的に指定することに失敗しました(上記のkeltarの答えを参照してください) – radcore

関連する問題