猿问

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

我已经浏览了 StackOverflow 和 Ask Ubuntu 上的所有解决方案。


我有一个围棋程序:


package main


import "C"


//export Getint

func 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.out

Error 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文件并且它是不可执行的。


慕斯709654
浏览 327回答 3
3回答

慕田峪4524236

您应该使用链接器选项&nbsp;-rpath,它告诉链接器在可执行程序中添加信息,在哪里可以找到像您的.so文件这样的运行时库。这可以使用 GCC 选项来完成,该选项-Wl指示 GCC 前端程序将选项传递给链接器:$&nbsp;gcc&nbsp;c.c&nbsp;t.so&nbsp;-Wl,-rpath=$(pwd)这将传递-rpath=$(pwd)给链接器,并$(pwd)导致 shell 调用pwd命令以返回当前目录。只要您不移动库,程序就应该可以工作。您也可以使用环境变量LD_LIBRARY_PATH,但不推荐使用。

Smart猫小萌

很可能您的加载程序找不到库。LD_LIBRARY_PATH在运行二进制文件之前,尝试将路径放在 libarry 所在的目录中。export&nbsp;LD_LIBRARY_PATH=/path/to/my/library ./a.out

慕雪6442864

.so 文件是共享对象,意思是所有需要它们的应用程序都可以使用的对象。也就是说,共享的。由于这种特性,它们需要存放在众所周知的地方。此外,它们需要由动态链接器索引。例如,在 linux 中,您通常有一个文件/etc/ld.so.conf,其中存储了自动读取共享对象的所有目录所以你的选择是:把你的共享对象文件放在一个众所周知的地方将您的共享对象文件放在您选择的位置,并让动态链接器知道它:在 linux 中,您可以修改ld.so.conf并运行ldconfig以更新 ld 索引正如其他人建议在环境变量 LD_LIBRARY_PATH 中写入 .so 的路径(因为动态链接器在运行应用程序之前读取它)。这必须在每个环境创建时完成其他建议在编译时使用 -rpath。请注意,通过这种方式,您无法在编译后移动 .so 文件我个人更喜欢在系统库路径中安装 .so 文件
随时随地看视频慕课网APP

相关分类

Go
我要回答