我已经浏览了 StackOverflow 和 Ask Ubuntu 上的所有解决方案。我有一个围棋程序:package mainimport "C"//export Getintfunc Getint() int { return 2}func main() {}我已经生成.so了名称为t.so and header fileth` 的文件现在我想在我的 C 程序中使用这个函数。我已经编写了代码,但我不知道如何执行它。#include <stdio.h>#include <t.h>int main(){int a;a=Getint();printf("number : %d",a);return 0;}当我执行它时gcc c.c t.so它生成a.out文件但在运行的时候a.out用./a.out它给出了一个错误:./a.outError while loading shared libraries: t.so: can not open shared object file: no such file or directory exists.然后我尝试:gcc -c c.c -l t.so所以它生成c.o文件并且它是不可执行的。
3 回答
慕田峪4524236
TA贡献1875条经验 获得超5个赞
Smart猫小萌
TA贡献1911条经验 获得超7个赞
很可能您的加载程序找不到库。LD_LIBRARY_PATH
在运行二进制文件之前,尝试将路径放在 libarry 所在的目录中。
export LD_LIBRARY_PATH=/path/to/my/library ./a.out
慕雪6442864
TA贡献1812条经验 获得超5个赞
.so 文件是共享对象,意思是所有需要它们的应用程序都可以使用的对象。也就是说,共享的。由于这种特性,它们需要存放在众所周知的地方。此外,它们需要由动态链接器索引。
例如,在 linux 中,您通常有一个文件/etc/ld.so.conf,其中存储了自动读取共享对象的所有目录
所以你的选择是:
把你的共享对象文件放在一个众所周知的地方
将您的共享对象文件放在您选择的位置,并让动态链接器知道它:在 linux 中,您可以修改ld.so.conf并运行ldconfig以更新 ld 索引
正如其他人建议在环境变量 LD_LIBRARY_PATH 中写入 .so 的路径(因为动态链接器在运行应用程序之前读取它)。这必须在每个环境创建时完成
其他建议在编译时使用 -rpath。请注意,通过这种方式,您无法在编译后移动 .so 文件
我个人更喜欢在系统库路径中安装 .so 文件
- 3 回答
- 0 关注
- 326 浏览
添加回答
举报
0/150
提交
取消