当前位置: 技术问答>linux和unix
第一次使用动态库链接出现undefined referenced to...
来源: 互联网 发布时间:2016-09-20
本文导语: 我不会写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...
我不会写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中该依赖的都已经依赖了,为什么还是出现这种错误呢?
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中该依赖的都已经依赖了,为什么还是出现这种错误呢?
|
一般都会产生一个链接文件:
ln -s libnet.so.1.5.0 libnet.so.1
有的还会有
ln -s libnet.so.1 libnet.so
ln -s libnet.so.1.5.0 libnet.so.1
有的还会有
ln -s libnet.so.1 libnet.so
|
cc sendpacket.o -o sendpacket
看明白了,出现这么一行,是因为楼主的第一行里面写了个sendpacket(少了.o) ,但是又没写如何生成sendpacket这个文件,所以make就根据默认规则自作主张了。
看明白了,出现这么一行,是因为楼主的第一行里面写了个sendpacket(少了.o) ,但是又没写如何生成sendpacket这个文件,所以make就根据默认规则自作主张了。
|
对于简单的情况:在没有Makefile文件的情况下,先手动执行那些编译命令,例如你的:
g++ -o linkthread.o -lnet -c linkthread.C sendpacket.o等等
先手动执行没有问题了,再去写Makefile文件。
g++ -o linkthread.o -lnet -c linkthread.C sendpacket.o等等
先手动执行没有问题了,再去写Makefile文件。
|
你的libnet.so文件在哪个目录下?把这个目录用-L选项加到你的LDFLAGS中
例如:
LDFLAGS +=-lnet -lpcap -L/usr/local/net
例如:
LDFLAGS +=-lnet -lpcap -L/usr/local/net
|
LDFLAGS += -lnet
bins := sendpacket myerr
objs := sendpacket.o myerr.o linkthread.o md5.o
all : $(bins)
clean :
-rm -f $(bins) $(objs)
|
cc sendpacket.o -o sendpacket
楼主的makefile里没有这个命令,为什么会执行它?
libnet库在什么地方?
是否需要用-L参数指定他所在的路径?
楼主的makefile里没有这个命令,为什么会执行它?
libnet库在什么地方?
是否需要用-L参数指定他所在的路径?
|
linkthread.o:linkthread.C sendpacket.o myerr.o
g++ -o myerr.o -c myerr.C
g++命令行里面所有的.h文件都要删掉。
注意.c文件名大小写
g++ -o myerr.o -c myerr.C
g++命令行里面所有的.h文件都要删掉。
注意.c文件名大小写
|
1、你的代码中没有main()函数。
2、你的目标是什么?是要生成可执行文件还是函数库?
3、给个简单的Makefile给你参考(用于生成动态库的)
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
|
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
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
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。