利用自己编译的库连接时报/usr/bin/ld: cannot find ,请问如何解决.

zhonghuashen 2008-04-21 11:37:08
利用自己编译的库连接时报[/usr/bin/ld: cannot find ....],请问如何解决.
本人自己做了个库叫[gl]
CC = gcc
LINK = gcc
编译命令: [$(CC) -fPIC -g -c $(CFLAGS) $(INCPATH) -o $@ $<]
连接成so命令:
[
VER_MAJ = 1
VER_MIN = 0
VER_PATCH = 0
DESTDIR = bin/
TARGET = gl
LINK_TARGET_SHARED = lib$(TARGET).so.$(VER_MAJ).$(VER_MIN).$(VER_PATCH)
LINK_LIB_SHARED = $(LINK) -shared -Wl,-soname,lib$(TARGET).so.$(VER_MAJ) \
$(LFLAGS) -o $(LINK_TARGET_SHARED) \
$(OBJECTS) $(LIBS)

]
最后生成库文件:[libgl.so.1.0.0]
我放在自己的目录下: [/opt/lib/]
修改[/etc/ld.so.conf]文件 增加目录[/opt/lib/]
运行[ldconfig] 后在目录[/opt/lib/] 生成[libgl.so.1]

以上是生成库文件的过程.
下面是我利用自己生成的库写程序后利用如下命令:
gcc -g -o testgl testgl.cpp -lgl

编译可以通过,但是连接时报:[/usr/bin/ld: cannot find ...], 请问如何解决.

我用的Linux 是Red Hat 9.0, 全部安装所有的软件的.





...全文
2369 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
hzcpig 2008-04-24
  • 打赏
  • 举报
回复
ldconfig是一个动态链接库管理命令,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为 /etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表.

ln -s则是软链接,也就是windows下快捷方式的概念。

当编译-lgl的时候,实际上找的是libgl.so,通过ldconfig或者链接的方式最终找到真正的库文件libgl.so.1.0.0
zhonghuashen 2008-04-24
  • 打赏
  • 举报
回复
To: hzcping cnwolf
VER_MAJ = 1
VER_MIN = 0
VER_PATCH = 0
DESTDIR = bin/
TARGET = gl
LINK_TARGET_SHARED = lib$(TARGET).so.$(VER_MAJ).$(VER_MIN).$(VER_PATCH)
LINK_LIB_SHARED = $(LINK) -shared -Wl,-soname,lib$(TARGET).so.$(VER_MAJ) \
$(LFLAGS) -o $(LINK_TARGET_SHARED) \
$(OBJECTS) $(LIBS)
利用以上的命令生成的so文件名为[libgl.so.1.0.0][shared file],
然后输入ldconfig命令后在与[libgl.so.1.0.0]文件相同的目录下生成文件[lib.sogl.1][link file]
然后输入ln -s libgl.so.1 libgl.so后生成[libgl.so][link file]
请问以上3个文件有什么区别?
cnwolf 2008-04-24
  • 打赏
  • 举报
回复
如果编译的动态库包含了版本信息,在链接的时候需要的库的名称是不需要包含版本号的

只有在执行的时候才需要

所以编译的时候会去找libgl.so这个文件

执行的时候会去找带版本号的库文件
hzcpig 2008-04-24
  • 打赏
  • 举报
回复
-Wl,-rpath=./ 表示在./目录(即当前目录)寻找库文件

gcc -shared -o libfoo.so foo.o就可以了么~~那说明你的那段makefile可能有问题,没贴全,也不好分析,你可以看看这个Makefile运行的时候输出的关于生成so的那部分命令。
hanb99 2008-04-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sourceid 的回复:]
$ gcc -g -o testgl testgl.cpp -L/opt/lib -lgl
[/Quote]
zhonghuashen 2008-04-24
  • 打赏
  • 举报
回复
gcc -shared -Wl,-soname,libgl.so.1 -o lib.so.1.0.0 .....
不行啊,能否指个名路,谢谢了/
hzcpig 2008-04-23
  • 打赏
  • 举报
回复
你先写个最简单so文件连接一下看看吧
[code=BatchFile]$ cat main.c
#include <stdio.h>
void foo(void);
int main()
{
printf("%s\n", __FILE__);
foo();
return 0;
}
$ cat foo.c
#include <stdio.h>
void foo(void)
{
printf("%s\n", __FILE__);
}
$ gcc -fPIC -c foo.c
$ gcc -shared -o libfoo.so foo.o
$ gcc -c main.c
$ gcc -o main -Wl,-rpath=./ main.o -L./ -lfoo
$ ./main
main.c
foo.c
$ ldd main
libfoo.so => ./libfoo.so (0x00002aaaaaaad000)
libc.so.6 => /lib64/libc.so.6 (0x00000030d0e00000)
/lib64/ld-linux-x86-64.so.2 (0x00000030cfe00000)
$ uname -msvrp
Linux 2.6.18-8.el5 #1 SMP Thu Mar 15 19:46:53 EDT 2007 x86_64 x86_64[/code]
zhonghuashen 2008-04-23
  • 打赏
  • 举报
回复
To:hzcpig
为什么gcc -shared -o libfoo.so foo.o
可以而
VER_MAJ = 1
VER_MIN = 0
VER_PATCH = 0
DESTDIR = bin/
TARGET = gl
LINK_TARGET_SHARED = lib$(TARGET).so.$(VER_MAJ).$(VER_MIN).$(VER_PATCH)
LINK_LIB_SHARED = $(LINK) -shared -Wl,-soname,lib$(TARGET).so.$(VER_MAJ) \
$(LFLAGS) -o $(LINK_TARGET_SHARED) \
$(OBJECTS) $(LIBS)
不可以?
zhonghuashen 2008-04-23
  • 打赏
  • 举报
回复
To:hzcpig
按您的步骤,有些问题
>>gcc -o main -Wl,-rpath=./ main.o -L./ -lfoo
这个通不过啊, 不过我用如下的语句就可以了
gcc -o main main.o -L./ -lfoo -lstd++
or
g++ -o main main.o -L./ -lfoo

所以有个问题
1: -Wl,-rpath=./ 啥意思
请不吝赐教,谢谢了,如分不过可开贴
zhonghuashen 2008-04-22
  • 打赏
  • 举报
回复
To : sourceid
gcc -g -o testgl testgl.cpp -L/opt/lib -lgl
试过,同样是这样。

To: minl
请问libgl.la 是什么文件,为什么要加这个文件,起的作用是什么,谢谢了。
sourceid 2008-04-22
  • 打赏
  • 举报
回复
$ gcc -g -o testgl testgl.cpp -L/opt/lib -lgl
zhonghuashen 2008-04-22
  • 打赏
  • 举报
回复
To:hzcpig
ln -s /opt/lib/libgl.so.1 /opt/lib/libgl.so
确保/opt/lib下有libgl.so文件,或者
cp /opt/lib/libgl.so.1 /usr/lib/libgl.so这样看看
刚试了,不行.
请帮忙啊,谢谢了
minl 2008-04-22
  • 打赏
  • 举报
回复
# The name that we can dlopen(3).
dlname='libgl.so.1.0.0'

# Names of this library.
library_names='libgl.so.1.0.0 libgl.so.1 libgl.so'

# The name of the static archive.
old_library='libgl.a'

# Libraries that this one depends upon.
dependency_libs=' -lm -ldl -lpthread'

# Version information for libSDL.
current=1
age=0
revision=0

# Is this an already installed library?
installed=yes

# Should we warn about portability when linking against -modules?
shouldnotlink=no

# Files to dlopen/dlpreopen
dlopen=''
dlpreopen=''

# Directory that this library needs to be installed in:
libdir='/opt/lib'
minl 2008-04-22
  • 打赏
  • 举报
回复
/opt/lib/下有个文件libgl.la
没有的话自己加一个 至少包含以下内容哦

# The name that we can dlopen(3).
dlname='libgl.so.1.0.0'

# Names of this library.
library_names='libgl.so.1.0.0 libgl.so.1 libSDL.so'

# The name of the static archive. 这一行也许没有
#old_library='libgl.a'

# Libraries that this one depends upon.
dependency_libs=' -lm -ldl -lpthread'

# Is this an already installed library?
installed=yes

# Should we warn about portability when linking against -modules?
#shouldnotlink=no

# Files to dlopen/dlpreopen
#dlopen=''
#dlpreopen=''

# Directory that this library needs to be installed in:
libdir='/opt/lib'


hzcpig 2008-04-22
  • 打赏
  • 举报
回复
ln -s /opt/lib/libgl.so.1 /opt/lib/libgl.so
确保/opt/lib下有libgl.so文件,或者
cp /opt/lib/libgl.so.1 /usr/lib/libgl.so这样看看

另外ldd testgl看看是否正确链接了so文件

23,116

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧