LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1380|回复: 4

請問ARM板上寫程序想調用.so動態庫里的函數應該如何編譯?

[复制链接]
发表于 2009-11-4 17:16:19 | 显示全部楼层 |阅读模式
大家好,我寫的程序里想調用a.so的動態庫里的函數bool b();可是不知道應該怎麼用,我按網上寫的方式編譯的時候這樣做arm-linux-g++ libb.so test.cpp -ldl -o test -static編譯的結果報錯說bool b();這個函數沒聲明,請問問題出在哪裡啊?必須在我的程序里用dlopen嗎??ps:包含 bool b()聲明的頭文件我是include了的
发表于 2009-11-4 21:27:12 | 显示全部楼层
#include "a.h"

int main()
{
if (b()){
do something...
}else{
do something...
}
return 0;
}

gcc thisfile.c -la

here a.so must named liba.so in the include path
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-11-5 09:10:08 | 显示全部楼层
謝謝tsuibin的解答,我後來發現問題出在這個函數bool b();沒有出現在共享庫源碼export.map里,就是說似乎它本來不是個接口函數,可是我想外部調用它,我試了這樣做:

在bool b()的頭文件xxx.h里改變bool b();聲明---》extern bool b();

在export.map里添加了一行:b;

然後重新生成.so,結果還是提示了以前相同的錯誤,說 b();undefined reference to

請問這種非接口函數想要外部調用有辦法嗎
回复 支持 反对

使用道具 举报

发表于 2009-11-5 11:20:31 | 显示全部楼层
Post by naga1003;2042587
大家好,我寫的程序里想調用a.so的動態庫里的函數bool b();可是不知道應該怎麼用,我按網上寫的方式編譯的時候這樣做arm-linux-g++ libb.so test.cpp -ldl -o test -static編譯的結果報錯說bool b();這個函數沒聲明,請問問題出在哪裡啊?必須在我的程序里用dlopen嗎??ps:包含 bool b()聲明的頭文件我是include了的


把libb.so放到/etc/ld.so.conf里面指定的目录下面,然後在ARM机器上执行 ldconfig,就可以用了。

直接调用.so文件里的内容可以用dlopen, dlsym和dlclose这几个函数,这么做比较灵活,但是弄不好软件包的目录会很乱,网上有好多现成的例子。
回复 支持 反对

使用道具 举报

发表于 2009-11-5 15:21:15 | 显示全部楼层
.so是动态连接库。
dlopen是动态加载动态连接
直接用 gcc -l 编译是静态加载动态连接。
报的哪个错是说你的库里面没有对应的函数。

从你的信息看,你根本没有把你的 a.so 连接上,不论是静态还是动态。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表