我复制粘贴How would a loaded library function call a symbol in the main application?中的代码,以帮助我理解加载的库如何工作。但是当我试图运行它时,它说它找不到文件,虽然当我做ls时文件就在当前目录中
@APG9591:/mnt/c/Users/fried/Desktop/KI3/Game$ gcc -shared -olibdlo.so dlo.c
/usr/bin/ld: /tmp/ccpGxAlo.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
/tmp/ccpGxAlo.o: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
@APG9591:/mnt/c/Users/fried/Desktop/KI3/Game$ gcc -shared -fPIC -olibdlo.so dlo.c
@APG9591:/mnt/c/Users/fried/Desktop/KI3/Game$ gcc -ldl -rdynamic main.c
/tmp/ccHtUgDf.o: In function `main':
main.c:(.text+0x2b): undefined reference to `dlopen'
main.c:(.text+0x3b): undefined reference to `dlerror'
main.c:(.text+0x66): undefined reference to `dlerror'
main.c:(.text+0x7b): undefined reference to `dlsym'
main.c:(.text+0x83): undefined reference to `dlerror'
main.c:(.text+0xc7): undefined reference to `dlclose'
collect2: error: ld returned 1 exit status
@APG9591:/mnt/c/Users/fried/Desktop/KI3/Game$ gcc -Wl,--no-as-needed -ldl -rdynamic main.c
@APG9591:/mnt/c/Users/fried/Desktop/KI3/Game$ ls
AI_A.c AI_B.c AI_C.c a.out dlo.c Game.c Game.h libdlo.so main.c runGame.c
@APG9591:/mnt/c/Users/fried/Desktop/KI3/Game$ ./a.out
libdlo.so: cannot open shared object file: No such file or directory
@APG9591:/mnt/c/Users/fried/Desktop/KI3/Game$
libdlo.so:无法打开共享对象文件:没有这样的文件或目录
为什么程序找不到文件libdlo.so?我该如何解决这个问题?谢谢!
答案 0 :(得分:2)
操作系统不会在本地目录中查找库
1)将您的lib移动到/usr/lib
2)在dlopen调用中指定相对路径"./libdlo.so"
感谢lps和ankur的回答
答案 1 :(得分:0)
请参阅此post中的答案。我最近安排了相同的问题,这肯定会有所帮助。
阅读完毕后,我建议您使用-rpath
选项。
只是为了好玩,您也可以使用ldconfig $(pwd)
来解决这个问题,我认为有时这种方法会更好。
有关详细信息,请阅读the linux how-to documentation on library,其中详细介绍了静态库,共享库和动态链接库。
有关越来越多的信息,请阅读Better understanding Linux secondary dependencies solving with examples,它将深入探讨通过动态链接器链接的库,即共享库和动态链接库。