为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用.so文件运行c程序

如何使用.so文件运行c程序

Go
慕斯709654 2021-12-07 15:25:21
我已经浏览了 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个赞

您应该使用链接器选项 -rpath,它告诉链接器在可执行程序中添加信息,在哪里可以找到像您的.so文件这样的运行时库。

这可以使用 GCC 选项来完成,该选项-Wl指示 GCC 前端程序将选项传递给链接器:

$ gcc c.c t.so -Wl,-rpath=$(pwd)

这将传递-rpath=$(pwd)给链接器,并$(pwd)导致 shell 调用pwd命令以返回当前目录。

只要您不移动库,程序就应该可以工作。


也可以使用环境变量LD_LIBRARY_PATH,但不推荐使用


查看完整回答
反对 回复 2021-12-07
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

很可能您的加载程序找不到库。LD_LIBRARY_PATH在运行二进制文件之前,尝试将路径放在 libarry 所在的目录中。

export LD_LIBRARY_PATH=/path/to/my/library
./a.out


查看完整回答
反对 回复 2021-12-07
?
慕雪6442864

TA贡献1812条经验 获得超5个赞

.so 文件是共享对象,意思是所有需要它们的应用程序都可以使用的对象。也就是说,共享的。由于这种特性,它们需要存放在众所周知的地方。此外,它们需要由动态链接器索引。

例如,在 linux 中,您通常有一个文件/etc/ld.so.conf,其中存储了自动读取共享对象的所有目录

所以你的选择是:

  • 把你的共享对象文件放在一个众所周知的地方

  • 将您的共享对象文件放在您选择的位置,并让动态链接器知道它:在 linux 中,您可以修改ld.so.conf并运行ldconfig以更新 ld 索引

  • 正如其他人建议在环境变量 LD_LIBRARY_PATH 中写入 .so 的路径(因为动态链接器在运行应用程序之前读取它)。这必须在每个环境创建时完成

  • 其他建议在编译时使用 -rpath。请注意,通过这种方式,您无法在编译后移动 .so 文件

我个人更喜欢在系统库路径中安装 .so 文件


查看完整回答
反对 回复 2021-12-07
  • 3 回答
  • 0 关注
  • 326 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信