2017-02-05 20 views
0

私はSDLとC++を使ってゲームを作っています。g ++はサードパーティのライブラリをリンクしていません

これまでは何もできませんでした。私はMacのためのすべての指示(私はMac v。10.12.2を持っています)とg ++をhttp://www.lazyfoo.net/tutorials/SDL/01_hello_SDL/index.phpに追いました。

今は、-l(小文字のL)オプションで指定されたライブラリが見つからないと言うリンカーエラーが発生しています。ここに私のMakefileがあります:

CC = g++ 
CFLAGS = -g -Wall -std=c++11 

SDL_PATH = /Users/myname/Documents/Code-Libraries/SDL2-2.0.5 
SDL_INCLUDE = -I$(SDL_PATH)/include 
SDL_LIB = -L$(SDL_PATH) -l/usr/local/lib/libSDL2.a 

default: SDL01 

SDL01: 01_hello_SDL.cpp 
    $(CC) $(CFLAGS) 01_hello_SDL.cpp $(SDL_LIB) $(SDL_INCLUDE) -o SDL01 

clean: 
    rm -f SDL01 *.o 

私は-lSDL2を試しました。私は-lSDLを試しました。私は-l/usr/local/lib/libSDL2.aを試しました。私は/Users/myname/Documents/Code-Libraries/SDL2-2.0.5とこれ(/ Users/myname/Documents/Code-Libraries)を書くさまざまな方法で-Lオプション(-lオプションなし)を試しました。 /SDL2-2.0.5)私に教えてくれた...

Undefined symbols for architecture x86_64: 
    "_SDL_CreateWindow", referenced from: 
     _main in 01_hello_SDL-f65b5c.o 
    "_SDL_Delay", referenced from: 
     _main in 01_hello_SDL-f65b5c.o 
    "_SDL_DestroyWindow", referenced from: 
     _main in 01_hello_SDL-f65b5c.o 
    "_SDL_FillRect", referenced from: 
     _main in 01_hello_SDL-f65b5c.o 
    "_SDL_GetError", referenced from: 
     _main in 01_hello_SDL-f65b5c.o 
    "_SDL_GetWindowSurface", referenced from: 
     _main in 01_hello_SDL-f65b5c.o 
    "_SDL_Init", referenced from: 
     _main in 01_hello_SDL-f65b5c.o 
    "_SDL_MapRGB", referenced from: 
     _main in 01_hello_SDL-f65b5c.o 
    "_SDL_Quit", referenced from: 
     _main in 01_hello_SDL-f65b5c.o 
    "_SDL_UpdateWindowSurface", referenced from: 
     _main in 01_hello_SDL-f65b5c.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
make: *** [SDL01] Error 1 

...他の人はプロジェクトのヘッダーを見つけることができませんでした。私は本当に失われて、本当にいくつかの助けを愛するだろう。ありがとうございました。

EDIT1:

これらのファイルは/〜/ドキュメント内のディレクトリです/コード・ライブラリ/ SDL2-:私はnm /usr/local/lib/libSDL2.a | grep _SDL_CreateWindowを行なったし、

0000000000001cb0 T _SDL_CreateWindow 
0000000000000f80 T _SDL_CreateWindowAndRenderer 
0000000000007620 t _SDL_CreateWindowAndRenderer_DEFAULT 
       U _SDL_CreateWindowAndRenderer_REAL 
0000000000001cc0 T _SDL_CreateWindowFrom 
0000000000009e80 t _SDL_CreateWindowFrom_DEFAULT 
       U _SDL_CreateWindowFrom_REAL 
0000000000009e30 t _SDL_CreateWindow_DEFAULT 
       U _SDL_CreateWindow_REAL 
0000000000000060 T _SDL_CreateWindowAndRenderer_REAL 
       U _SDL_CreateWindow_REAL 
       U _SDL_CreateWindow_REAL 
00000000000030a0 T _SDL_CreateWindowFrom_REAL 
0000000000000760 t _SDL_CreateWindowTexture 
0000000000002010 T _SDL_CreateWindow_REAL 
       U _SDL_CreateWindow_REAL 

EDIT2を得た

2.0.5 /ディレクトリ:

Android.mk    SDL2.spec.in    cmake_uninstall.cmake.in 
BUGS.txt     TODO.txt     configure 
CMakeLists.txt   VisualC/     configure.in 
COPYING.txt    VisualC-WinRT/   debian/ 
CREDITS.txt    VisualC.html    docs/ 
INSTALL.txt    WhatsNew.txt    include/ 
Makefile.in    Xcode/     sdl2-config.cmake.in 
Makefile.minimal   Xcode-iOS/    sdl2-config.in 
Makefile.pandora   acinclude/    sdl2.m4 
Makefile.psp    android-project/   sdl2.pc.in 
Makefile.wiz    autogen.sh    src/ 
README-SDL.txt   build/     test/ 
README.txt    build-scripts/    
SDL2.spec     cmake/      
+0

ここでの構文は '-l/usr/local/lib/libSDL2.a'ではなく' -lSDL2'または '/ usr/local/lib/libSDL2.a'でなければなりません。 – nos

+0

@nosあなたは説明できますか?私は、g ++が/usr/local/lib/libSDL2.aを私がリンクしようとしているライブラリであると理解する方法を理解していません。それは* .aなの? – astrocat1997

+0

@nosまた、動作しませんでした:-(。アーキテクチャx86_64のための '未定義のシンボル:' 'たくさんのジャンクを持っています – astrocat1997

答えて

1

申し訳ありませんが、@ JohnZwinckのおかげで、私が間違っていたことを理解することができました。サードパーティのライブラリがあったg ++のコンパイラに、私は間違った場所(-L/Users/myname/Documents/Code-Libraries/SDL2-2.0.5)と何も意味しない名前(-lSDL2)を与えていました。だから私はさらに読んだり、重要な引用符はhttps://linux.die.net/man/1/g++です。

オプションやその他の引数を組み合わせることができます。ほとんどの場合、使用する順序は関係ありません。同じ種類の複数のオプションを使用すると、順序は問題になります。たとえば、-Lを複数回指定すると、指定された順序でディレクトリが検索されます。また、-lオプションの配置も重要です。

リンカオプション

オブジェクトファイル名-llibrary -nostartfiles -nodefaultlibs -nostdlib -pie -rdynamic -s -static -static-libgccの-shared -shared-libgccの-symbolic -Tスクリプト-Wl 、オプション-Xlinkerオプション-uシンボル

ディレクトリオプション

-Bprefix -Idir -iquotedir -Ldir -specs =ファイル-I- --sysroot = DIR

基本的に、-L ディレクトリは、-l ライブラリの前に来る必要があります。これは、-Lオプションがg ++にライブラリの場所を指定し、-lオプションがどのライブラリかを示すためです。 -lの前に-Lがなければ、g ++は-lからライブラリを探す場所を知らない。

私が間違っている場合は、私を修正する気軽に!しかし、これは私の問題を解決しました。

関連する問題