QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1402|回复: 12

如果程序中用到了非系统库,我怎么编译?

[复制链接]
发表于 2002-12-5 15:42:19 | 显示全部楼层 |阅读模式
一个程序2.c,用到了非系统库
[code:1]
#include <stdio.h>
#include <ggi/ggi.h>


int main()
{
        if (ggiInit() < 0)
        {
                fprintf(stderr, "Cannot initalize LibGGI!\n");
                exit(1);
        }

        ggiExit();
}
[/code:1]
这个库在/usr/local/lib中。
我已经在/etc/ld.so.conf中加上一行:/usr/local/lib。
用gcc 2.c -o 2编译,报
[code:1]
[root@large11 root]# gcc 2.c -o 2
/tmp/ccDC2yhA.o: In function `main':
/tmp/ccDC2yhA.o(.text+0x11): undefined reference to `ggiInit'
/tmp/ccDC2yhA.o(.text+0x3a): undefined reference to `ggiExit'
collect2: ld returned 1 exit status
[/code:1]
的错误。
用gcc 2.c -L/usr/local/lib -lggi -o 2命令
则编译通过生成2,运行报错:
[code:1]
[root@large11 root]# ./2
./2: error while loading shared libraries: libggi.so.2: cannot open shared objec
t file: No such file or directory
[/code:1]
有谁知道原因,谢谢
发表于 2002-12-5 17:34:33 | 显示全部楼层
我没加-L/usr/local/lib可以编译通过,运行也通过。
回复

使用道具 举报

 楼主| 发表于 2002-12-5 17:47:56 | 显示全部楼层
你有ggi这个库?还是你修改了我的程序? :-(  :-(
回复

使用道具 举报

发表于 2002-12-5 18:12:07 | 显示全部楼层
我没有ggi,我自己随便编译一个库,把他放到/usr/lib/或/usr/local/lib下。然后写个程序调用库里的函数。我只加-lxxxxx就能编译过去(不加编不过)并能正确执行。
回复

使用道具 举报

 楼主| 发表于 2002-12-5 22:00:56 | 显示全部楼层
对啊,我也是这样啊,我用的库是libggi.so,可是不行啊,怎么编译都不通过,明天我也试试你那样
回复

使用道具 举报

 楼主| 发表于 2002-12-6 09:32:55 | 显示全部楼层
不好意思,用什么命令生成共享库?
回复

使用道具 举报

发表于 2002-12-6 09:45:57 | 显示全部楼层
gcc -c xxxx.c -o yyyy.so
回复

使用道具 举报

 楼主| 发表于 2002-12-6 09:53:38 | 显示全部楼层
奇怪,用自己的做的库,编译出来后也能运行,但是为什么用别的库,可以编译,就是不能运行?
回复

使用道具 举报

 楼主| 发表于 2002-12-6 11:27:06 | 显示全部楼层
郁闷,用anjuta自动生成一个project,build就好了。而用自己的就不行?
回复

使用道具 举报

发表于 2002-12-6 11:49:27 | 显示全部楼层
我估计是编译参数问题
回复

使用道具 举报

 楼主| 发表于 2002-12-6 11:54:57 | 显示全部楼层
对,问题应该出在这儿,我的好好琢磨自动生成的makefile的编译参数。
回复

使用道具 举报

发表于 2002-12-19 09:53:45 | 显示全部楼层
两位:
有几点我想提醒,
<1> 在ld.so.conf 中添加路径后,我记得应该运行ldconfig才可生效。
<2> 编译so,我常用-shared -g -o 这样能看到相应的到调试信息。
<3> 链别人的库我一般用 -l 指定名称,只要库的路径在你的ld.so.cnf有纪录就可以。实在不行用-L直接写路径不及可以么?
<4> 实在没办法干脆用dlopen吧! 哈哈~~

还有两位谁是makefile的高手,能不能帮我看看论坛里《关于makefile的几个问题》的贴子。小弟有理了!!
回复

使用道具 举报

发表于 2002-12-19 10:05:19 | 显示全部楼层

弄明白一个问题先

连接时指定-L 和 -l是连接的静态库,一般来说每个动态库(so)都有相应的静态版本,而在运行的时候需要加载动态库。
所以对于make的时候,需要采用gcc -o a a.o -Lpath -lname来连接
而在运行的时候需要在ld.so.conf或者通过设置LD_LIBRARY_PATH环境变量来让应用程序加载正确的动态连接库
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-5-18 06:29 , Processed in 0.090730 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

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