g++不链接第三方库

g++ does not link third-party libraries

本文关键字:第三方 链接 g++      更新时间:2023-10-16

我正在尝试使用SDL和C++制作游戏。

到目前为止,我还没能用它做任何事情。我遵循了Mac的所有说明(我有一个Mac版本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。我只尝试过-l选项(无-l选项)和各种写作方式/Users/myname/Documents/Code Libraries/SDL2-2.0.5,而这个选项(/Users/my name/Documents/Code Library/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

而其他人告诉我,他们找不到该项目的标题。我真的很失落,真的很想得到一些帮助。非常感谢。

第1版:

我做了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

第2版:

这些是~/Documents/Code Libraries/SDL2-2.0.5/directory:中的文件/目录

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/                    

好吧,多亏了@JohnZwinck,我才弄清楚自己做错了什么。当告诉编译器g++第三方库在哪里时,我给了它错误的位置(-L/Users/myname/Documents/Code-Libraries/SDL2-2.0.5)和一个对它毫无意义的名称(-lSDL2)。因此,我做了一些进一步的阅读,以下是https://linux.die.net/man/1/g++:

您可以混合选项和其他参数。在大多数情况下,您使用的顺序无关紧要。当你使用几种相同的选项时,顺序确实很重要;例如,如果您多次指定-L,则会按指定的顺序搜索目录。此外,-l选项的位置也很重要。

链接器选项

对象文件名-library-nostartfiles-nodefaultlibs-nostlib-pie-rdynamic-s-static-static libgcc-shared-shared libgcc-symbolic-T script-Wl,option-Xlinker option-u symbol

目录选项

-Bprefix-Idir-igotedir-Ldir-specs=文件-I---sysroot=dir

因此,基本上,-L目录需要位于-L之前,因为-L选项告诉g++在哪里查找库,然后-L选项说明它是什么库。如果没有-L之前的-L,g++不知道从-L在哪里查找该库。

如果我错了,请随时纠正我!但这解决了我的问题。