共享库到底是如何用的?

中文QNX 讨论: 欢迎大家灌水,讨论有关QNX 问题。
回复
QNX master
Senior Member
帖子: 852
注册时间: 周五 9月 12, 2003 4:24 am

共享库到底是如何用的?

帖子 QNX master » 周二 1月 25, 2005 5:18 pm

现在我想知道共享库到底是如何用的,比如我编写了一段代码test.c,里面的函数想给别人用,但又不希望提供原代码,于是我用qcc -shared test.c -o libtest.so生成了一个名为libtest.so的库,但当我用qcc -ltest other.c -o target联编时,other.c是别人的程序,里边调用了定义在test.c里面的函数,但是编译时总是说函数没有定义,我的方法错在哪里呢?

QNX master
Senior Member
帖子: 852
注册时间: 周五 9月 12, 2003 4:24 am

帖子 QNX master » 周三 1月 26, 2005 8:42 am

xtang,请回答一下好吗?

power_du
Senior Member
帖子: 149
注册时间: 周五 9月 12, 2003 4:37 am

帖子 power_du » 周三 1月 26, 2005 10:31 am

-ltest放在编译命令行的最后面试试

QNX master
Senior Member
帖子: 852
注册时间: 周五 9月 12, 2003 4:24 am

帖子 QNX master » 周三 1月 26, 2005 1:42 pm

same

power_du
Senior Member
帖子: 149
注册时间: 周五 9月 12, 2003 4:37 am

帖子 power_du » 周三 1月 26, 2005 2:35 pm

是不是没有制定libtest.so的路径,试试加上 -L libpath

power_du
Senior Member
帖子: 149
注册时间: 周五 9月 12, 2003 4:37 am

帖子 power_du » 周三 1月 26, 2005 2:36 pm

是不是没有指定libtest.so的路径,试试加上 -L libpath

xtang
Moderator
帖子: 1816
注册时间: 周五 9月 12, 2003 4:14 am
来自: China

帖子 xtang » 周四 1月 27, 2005 9:34 am

对,加-L path或直接链接文件。

qcc -o target other.c -L `pwd` -l test

qcc -o target other.c `pwd`/libtest.so

nakeyfish
Senior Member
帖子: 375
注册时间: 周五 8月 06, 2004 4:12 pm
来自: BJ

帖子 nakeyfish » 周四 1月 27, 2005 12:00 pm

在commonm.mk中加:
#===== EXTRA_OBJS - object files and libraries contributed additionaly on link/archive step
EXTRA_OBJS+=$(PROJECT_ROOT_rbCommonSL)/x86/so-g/libtest.so

这句话是我在LINK页面加引用时IDE自动生成的.

QNX master
Senior Member
帖子: 852
注册时间: 周五 9月 12, 2003 4:24 am

帖子 QNX master » 周四 1月 27, 2005 4:56 pm

楼上的,还是不行呀,开始的错误是“implicit declaration of function”,这是编译都没有通过,再共享库中函数定义有什么特别吗?再windows下需要用export或import来导入或导出,QNX下是怎么规定的呢?另外为了让编译通过我不得不再other.c中首先声名了一下函数func()(test.c中的函数),现在编译通过了,可是出现错误提示“/usr/bin/ntox86-ld cannot open /libtest.so”的提示。

xtang
Moderator
帖子: 1816
注册时间: 周五 9月 12, 2003 4:14 am
来自: China

帖子 xtang » 周四 1月 27, 2005 9:16 pm

要引用lib中的函数,都要声名。要不然,/usr/include/下面那许多.h干什么用?你如果要编一个库给别人用,那你至少就得有比如test.h那样的头文件让人#include。

至于找不到libtest.so,那就是PATH没有设对了。

QNX master
Senior Member
帖子: 852
注册时间: 周五 9月 12, 2003 4:24 am

帖子 QNX master » 周五 1月 28, 2005 8:30 am

我的所有文件都是放在root目录下的,加了-L /root或 -L 'pwd' /root都不行呀!

xtang
Moderator
帖子: 1816
注册时间: 周五 9月 12, 2003 4:14 am
来自: China

帖子 xtang » 周五 1月 28, 2005 10:02 am

代码: 全选

$ pwd
/home/xtang/src/sotest
$ cat sotest.c
#include <stdio.h>

int function1(int i)
{
   printf("This is funciton1, i is %d\n", i);
   return i;
}
$ cat main.c
#include <stdio.h>

int main()
{
        function1(3);
        return 0;
}
$ qcc -shared -o libsotest.so sotest.c
$ qcc -o sotest main.c -L /home/xtang/src/sotest -lsotest
$ ./sotest
This is funciton1, i is 3
$ qcc -o sotest1 main.c -l/home/xtang/src/sotest/libsotest.so
$ ./sotest1
This is funciton1, i is 3

QNX master
Senior Member
帖子: 852
注册时间: 周五 9月 12, 2003 4:24 am

帖子 QNX master » 周五 1月 28, 2005 3:22 pm

ok,多谢!

回复