第一次使用动态库链接出现undefined referenced to...

千羽鸣 2010-08-19 09:19:04
我不会写Makefile,写的一个如下:
linkthread.o:linkthread.C sendpacket myerr
g++ -o linkthread.o -lnet -c linkthread.C sendpacket.o
myerr.o:myerr.h myerr.C
g++ -o myerr -c myerr.C myerr.h
sendpacket.o:sendpacket.h sendpacket.C md5.o
g++ -o sendpacket.o -lnet md5.o -c sendpacket.C sendpacket.h
md5.o:md5.c md5.h
g++ -o md5.o -c md5.c md5.h

make之后,悲剧发生了:
cc sendpacket.o -o sendpacket
/usr/lib/gcc/i486-linux-gnu/4.4.1/../../../../lib/crt1.o: In function `_start':
/build/buildd/eglibc-2.10.1/csu/../sysdeps/i386/elf/start.S:115: undefined reference to `main'
sendpacket.o: In function `SendFindServerPacket(libnet_context*)':
sendpacket.C:(.text+0x11a): undefined reference to `libnet_write_link'
sendpacket.o: In function `SendNamePacket(libnet_context*, unsigned char const*)':
sendpacket.C:(.text+0x28a): undefined reference to `l_name'
sendpacket.C:(.text+0x301): undefined reference to `MD5Init(MD5_CTX*)'
sendpacket.C:(.text+0x31e): undefined reference to `MD5Update(MD5_CTX*, unsigned char*, unsigned int)'
sendpacket.C:(.text+0x333): undefined reference to `MD5Final(unsigned char*, MD5_CTX*)'
sendpacket.C:(.text+0x3fa): undefined reference to `l_name'
sendpacket.C:(.text+0x451): undefined reference to `libnet_write_link'
sendpacket.o: In function `SendPasswordPacket(libnet_context*, unsigned char const*)':
sendpacket.C:(.text+0x4bc): undefined reference to `l_password'
sendpacket.C:(.text+0x597): undefined reference to `MD5Init(MD5_CTX*)'
sendpacket.C:(.text+0x5b4): undefined reference to `MD5Update(MD5_CTX*, unsigned char*, unsigned int)'
sendpacket.C:(.text+0x5c9): undefined reference to `MD5Final(unsigned char*, MD5_CTX*)'
sendpacket.C:(.text+0x6ad): undefined reference to `l_password'
sendpacket.C:(.text+0x73e): undefined reference to `libnet_write_link'
sendpacket.o: In function `SendEndCertPacket(libnet_context*)':
sendpacket.C:(.text+0x7e7): undefined reference to `libnet_write_link'
sendpacket.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status
make: *** [sendpacket] 错误 1
我很奇怪,
MD5Final等几个函数已经在md5.h中有声明,在md5.c中有定义,而libnet_write_几个函数也是在libnet库中有实体,我这个Makefile中该依赖的都已经依赖了,为什么还是出现这种错误呢?
...全文
33321 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
千羽鸣 2010-08-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 wwwunix 的回复:]

一般都会产生一个链接文件:
ln -s libnet.so.1.5.0 libnet.so.1
有的还会有
ln -s libnet.so.1 libnet.so
[/Quote]
楼上的意思是,为了保证能够链接到宿主系统中的库,安装包中的Makefile都会带有这类命令来保证-l选项能够链接正确,即使版本不同,也可以创建一个链接使之指向目标值,是这样子吗?似有豁然开朗之感……
千羽鸣 2010-08-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wwwunix 的回复:]

你的libnet.so文件在哪个目录下?把这个目录用-L选项加到你的LDFLAGS中
例如:
LDFLAGS +=-lnet -lpcap -L/usr/local/net
[/Quote]
仍然是那个样子,我的本意是直接引用系统中已经存在的动态库libpcap.so.1.0.0和libnet.so.1.5.0,莫非这两个文件名根据-l选项的命名规则居然是找不到的?那也太离谱了吧……
wwwunix 2010-08-19
  • 打赏
  • 举报
回复
一般都会产生一个链接文件:
ln -s libnet.so.1.5.0 libnet.so.1
有的还会有
ln -s libnet.so.1 libnet.so
千羽鸣 2010-08-19
  • 打赏
  • 举报
回复
果然是动态链接库链接的问题,我把两个库文件拷到当前文件夹下:
tyh@tyh-laptop:~/linkage/linkagecui$ find *.so.*
libnet.so.1
libpcap.so.0.8
然后最后一句编译时,试着:
linkapp:$(TARGETS)
g++ -o linkapp -L. -lnet -lpcap $(TARGETS)
编译依然是失败的
但是改成这样子:
g++ -o linkapp libnet.so.1 libpcap.so.0.8 $(TARGETS)
这时就编译成功了!突然想起我的两个库文件实际的文件名(/usr/lib下的那个,我这两个是原来的代码自带的老版本库):
libpcap.so.1.0.0
libnet.so.1.5.0
话说加上-lname选项之后就会自动去库文件夹寻找符合libname.so的文件,是不是说像libnet.so.1.5.0这种格式的名字就不行了呢?我现在正在做一个软件的修改重写工作,由于原有的Makefile是autoconf自动生成的,不具有可读性,所以就自己写Makefile,现在看来,真正能够自由安装的安装包的Makefile是否会带有那种搜寻符合libname.so.*的文件然后把名字作为动态库加进去呢?
期待有经验人士解决
wwwunix 2010-08-19
  • 打赏
  • 举报
回复
你的libnet.so文件在哪个目录下?把这个目录用-L选项加到你的LDFLAGS中
例如:
LDFLAGS +=-lnet -lpcap -L/usr/local/net
千羽鸣 2010-08-19
  • 打赏
  • 举报
回复
修改Makefile为这个样子:
CC=g++
LDFLAGS +=-lnet -lpcap
TARGETS=main.o linkthread.o myerr.o sendpacket.o md5.o configfile.o

linkapp:$(TARGETS)
g++ -o linkapp -lnet -lpcap $(TARGETS)
main.o:linkthread.o myerr.o sendpacket.o md5.o main.C
$(CC) -c main.C
linkthread.o:linkthread.C sendpacket.o myerr.o configfile.o
$(CC) -c linkthread.C
configfile.o:configfile.C configfile.h queue.h global.h
$(CC) -c configfile.C
myerr.o:myerr.h myerr.c
$(CC) -c myerr.c myerr.h
sendpacket.o:sendpacket.h sendpacket.C md5.o
$(CC) -c sendpacket.C
md5.o:md5.c md5.h
$(CC) -o md5.o -c md5.c
clean:
rm *.o
然后依次执行 make clean 和make
tyh@tyh-laptop:~/linkage/linkagecui$ make clean
rm *.o
tyh@tyh-laptop:~/linkage/linkagecui$ make
g++ -o md5.o -c md5.c
g++ -c sendpacket.C
g++ -c myerr.c myerr.h
g++ -c configfile.C
g++ -c linkthread.C
g++ -c main.C
g++ -o linkapp -lnet -lpcap main.o linkthread.o myerr.o sendpacket.o md5.o configfile.o
linkthread.o: In function `init()':
linkthread.C:(.text+0x6a): undefined reference to `libnet_init'
linkthread.C:(.text+0xc5): undefined reference to `pcap_open_live'
linkthread.C:(.text+0xfb): undefined reference to `pcap_fileno'
linkthread.C:(.text+0x10d): undefined reference to `libnet_get_hwaddr'
linkthread.C:(.text+0x12e): undefined reference to `libnet_geterror'
linkthread.C:(.text+0x201): undefined reference to `pcap_compile'
linkthread.C:(.text+0x218): undefined reference to `pcap_geterr'
linkthread.C:(.text+0x23f): undefined reference to `pcap_setfilter'
linkthread.C:(.text+0x256): undefined reference to `pcap_geterr'
linkthread.C:(.text+0x274): undefined reference to `pcap_freecode'
linkthread.o: In function `release_network()':
linkthread.C:(.text+0x2a3): undefined reference to `pcap_close'
linkthread.C:(.text+0x2b0): undefined reference to `libnet_destroy'
linkthread.o: In function `link_thread()':
linkthread.C:(.text+0x54d): undefined reference to `pcap_next_ex'
sendpacket.o: In function `SendFindServerPacket(libnet_context*)':
sendpacket.C:(.text+0x11a): undefined reference to `libnet_write_link'
sendpacket.o: In function `SendNamePacket(libnet_context*, unsigned char const*)':
sendpacket.C:(.text+0x451): undefined reference to `libnet_write_link'
sendpacket.o: In function `SendPasswordPacket(libnet_context*, unsigned char const*)':
sendpacket.C:(.text+0x73e): undefined reference to `libnet_write_link'
sendpacket.o: In function `SendEndCertPacket(libnet_context*)':
sendpacket.C:(.text+0x7e7): undefined reference to `libnet_write_link'
collect2: ld returned 1 exit status
make: *** [linkapp] 错误 1
由此看来应该是最后的目标文件生成那一句除了问题,几个定义在动态库中的函数都找不到。正在网上寻找中,有经验人士指点一下小弟啦
Wenxy1 2010-08-19
  • 打赏
  • 举报
回复
# Makefile

LDFLAGS += -lnet

bins := sendpacket myerr

objs := sendpacket.o myerr.o linkthread.o md5.o

all : $(bins)

clean :
-rm -f $(bins) $(objs)
bluejays 2010-08-19
  • 打赏
  • 举报
回复
linkthread.o:linkthread.C sendpacket.o myerr.o
g++ -o linkthread.o -lnet -c linkthread.C sendpacket.o myerr.o
myerr.o:myerr.h myerr.C
g++ -o myerr.o -c myerr.C
sendpacket.o:sendpacket.h sendpacket.C md5.o
g++ -o sendpacket.o -lnet md5.o -c sendpacket.C
md5.o:md5.c md5.h
g++ -o md5.o -c md5.c
千羽鸣 2010-08-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bluejays 的回复:]

linkthread.o:linkthread.C sendpacket.o myerr.o

g++ -o myerr.o -c myerr.C

g++命令行里面所有的.h文件都要删掉。
注意.c文件名大小写
[/Quote]
写成.C是因为我的文件名确实是这么命名的,.C,和.cc,.cpp一样都是默认的C++源文件名
wwwunix 2010-08-19
  • 打赏
  • 举报
回复
对于简单的情况:在没有Makefile文件的情况下,先手动执行那些编译命令,例如你的:
g++ -o linkthread.o -lnet -c linkthread.C sendpacket.o等等
先手动执行没有问题了,再去写Makefile文件。
bluejays 2010-08-19
  • 打赏
  • 举报
回复
cc sendpacket.o -o sendpacket
看明白了,出现这么一行,是因为楼主的第一行里面写了个sendpacket(少了.o) ,但是又没写如何生成sendpacket这个文件,所以make就根据默认规则自作主张了。
wwwunix 2010-08-19
  • 打赏
  • 举报
回复
1、你的代码中没有main()函数。
2、你的目标是什么?是要生成可执行文件还是函数库?
3、给个简单的Makefile给你参考(用于生成动态库的)

library:libLIB_API.so
LIB_API.o:LIB_API.cpp
g++ -c -fpic LIB_API.cpp
libLIB_API.so:LIB_API.o
g++ -shared LIB_API.o -o libLIB_API.so
clean:
rm *.o
rm libLIB_API.so
bluejays 2010-08-19
  • 打赏
  • 举报
回复
linkthread.o:linkthread.C sendpacket.o myerr.o

g++ -o myerr.o -c myerr.C

g++命令行里面所有的.h文件都要删掉。
注意.c文件名大小写
bluejays 2010-08-19
  • 打赏
  • 举报
回复
cc sendpacket.o -o sendpacket
楼主的makefile里没有这个命令,为什么会执行它?

libnet库在什么地方?
是否需要用-L参数指定他所在的路径?

23,116

社区成员

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

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