sudo apt-get install libsdl2-dev
2.编辑源文件, hello.c
#include <SDL2/SDL.h>int main(){SDL_Window* window =0 SDL_Renderer* render=0 SDL_Init(SDL_INIT_EVERYTHING) window=SDL_CreateWindow("hello",SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,640,480,SDL_WINDOW_SHOWN) render=SDL_CreateRenderer(window,-1,0) SDL_SetRenderDrawColor(render,0,255,0,255) SDL_RenderClear(render) SDL_RenderPresent(render) SDL_Delay(3000) SDL_DestroyWindow(window) SDL_DestroyRenderer(render) SDL_Quit() return 0}
3.编译
gcc hello.c -lSDL2
如果编译成功,会生成a.out可执行文件
4.运行
./a.out
gcc编译时,当使用动态库编译可以按照几种写法1.gcc test.c ./libSDL2-2.so
2.gcc test.c -lSDL2-2
3.gcc test.c -L/home/test -lSDL2-2
一般的编译参数都是按照2或3去写
2写法的含义是从/lib或者/usr/lib目录下寻找名称为SDL2-2的库,即寻找/lib/libSDL2-2.so或者/usr/lib/libSDL2-2.so文件进行链接,当然如果没有动态库就会去找静态库,再没有应该就会在编译时报错
3写法的含义是从-L参数首先从指定的目录中寻找需要链接的库文件,随后再去寻找系统文件夹中是否存在需要的库
1写法的含义是将当前目录下的./libSDL2-2.so.0文件链接进最终文件,因此执行readelf -a a.out后在动态库部分所看到的路径就是./libSDL2-2.so.0,进而在执行文件时仅会从当前目录下寻找libSDL2-2.so.0文件,当执行文件时所在的目录下没有该文件时就会出现找不到库文件的 *** 作
你第二次 *** 作时,因为function.so库文件与a.out文件在同一个目录,同时也是在该目录下执行的ldd *** 作及运行a.out,a.out在加载动态库时从当前目录下找到了所需要的库文件,此时能够执行成功(ldd命令实质是一个脚本,通过设置环境变量运行动态库链接器来输出所有待链接的动态库)。
你可以试试将a.out拷贝至其他目录再次运行,将出现和第一次 *** 作时一样的现象,找不到function.so文件。
具体的解决方法就是修改编译参数,将./libSDL2-2.so.0修改为-lSDL2-2并将libSDL2-2.so.0文件拷贝至/usr/lib目录下,并且可能因为没有修改链接器的缓存文件(将可能找不到带版本号后缀的动态库),需要在/usr/lib目录下建立一个文件连接(ln -s libSDL2-2.so.0 libSDL2-2.so)或者直接修改名称为libSDL2-2.so
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)