collect2: ld returned 1 exit status链接错误

wyjq395 2010-12-23 01:07:43
编译网上下载的开源软件opencapwap,使用make命令成功编译
但是默认的编译器是gcc,而我需要交叉编译,需要编译出能在MIPS下运行的程序。
编译结果如下(输出信息不多,全拷贝出来):
[root@SS-SERVER1 capwap-0.93.3]# make all
/home/yang/openwrt_sdk/OpenWrt-SDK-Linux-i686-1/staging_dir_mipsel/bin/mipsel-linux-gcc -Wall -g -O0 -D_REENTRANT -DBCM -I /home/yang/openwrt_sdk/OpenWrt-SDK-Linux-i686-1/staging_dir_mipsel/usr/include -DCW_DEBUGGING -c -o CWThread.o CWThread.c
CWThread.c: In function `CWThreadTimedSemWait':
CWThread.c:466: warning: implicit declaration of function `sem_timedwait'
/home/yang/openwrt_sdk/OpenWrt-SDK-Linux-i686-1/staging_dir_mipsel/bin/mipsel-linux-gcc -Wall -g -O0 -D_REENTRANT -DBCM -I /home/yang/openwrt_sdk/OpenWrt-SDK-Linux-i686-1/staging_dir_mipsel/usr/include -DCW_DEBUGGING -c -o CWBinding.o CWBinding.c
/home/yang/openwrt_sdk/OpenWrt-SDK-Linux-i686-1/staging_dir_mipsel/bin/mipsel-linux-gcc -Wall -g -O0 -D_REENTRANT -DBCM -I /home/yang/openwrt_sdk/OpenWrt-SDK-Linux-i686-1/staging_dir_mipsel/usr/include -DCW_DEBUGGING -c -o WTPBinding.o WTPBinding.c
/home/yang/openwrt_sdk/OpenWrt-SDK-Linux-i686-1/staging_dir_mipsel/bin/mipsel-linux-gcc -Wall -g -O0 -D_REENTRANT -DBCM -I /home/yang/openwrt_sdk/OpenWrt-SDK-Linux-i686-1/staging_dir_mipsel/usr/include -DCW_DEBUGGING -c -o WTPBcmDriverInteraction.o WTPBcmDriverInteraction.c
/home/yang/openwrt_sdk/OpenWrt-SDK-Linux-i686-1/staging_dir_mipsel/bin/mipsel-linux-gcc -Wall -g -O0 -D_REENTRANT -DBCM -I /home/yang/openwrt_sdk/OpenWrt-SDK-Linux-i686-1/staging_dir_mipsel/usr/include -DCW_DEBUGGING -c -o WTPSettingsFile.o WTPSettingsFile.c
/home/yang/openwrt_sdk/OpenWrt-SDK-Linux-i686-1/staging_dir_mipsel/bin/mipsel-linux-gcc -Wall -g -O0 -D_REENTRANT -DBCM -I /home/yang/openwrt_sdk/OpenWrt-SDK-Linux-i686-1/staging_dir_mipsel/usr/include -DCW_DEBUGGING -c -o timerlib.o timerlib.c
/home/yang/openwrt_sdk/OpenWrt-SDK-Linux-i686-1/staging_dir_mipsel/bin/mipsel-linux-gcc -DWRITE_STD_OUTPUT WTP.o WTPBcmFrameReceive.o WTPConfigFile.o WTPProtocol.o WTPProtocol_User.o WTPDiscoveryState.o WTPJoinState.o WTPConfigureState.o WTPDataCheckState.o WTPRunState.o WTPRunStateCheck.o WTPRetransmission.o WTPSulkingState.o CWCommon.o CWConfigFile.o CWErrorHandling.o CWSafeList.o CWList.o CWLog.o CWNetwork.o CWProtocol.o CWRandom.o CWSecurity.o CWOpenSSLBio.o CWStevens.o CWThread.o CWBinding.o WTPBinding.o WTPBcmDriverInteraction.o WTPSettingsFile.o timerlib.o /home/yang/openwrt_sdk/OpenWrt-SDK-Linux-i686-1/staging_dir_mipsel/usr/lib/libssl.a /home/yang/openwrt_sdk/OpenWrt-SDK-Linux-i686-1/staging_dir_mipsel/usr/lib/libcrypto.a /home/yang/openwrt_sdk/OpenWrt-SDK-Linux-i686-1/staging_dir_mipsel/lib/libpthread.a /home/yang/openwrt_sdk/OpenWrt-SDK-Linux-i686-1/staging_dir_mipsel/lib/libdl.a /home/yang/openwrt_sdk/OpenWrt-SDK-Linux-i686-1/staging_dir_mipsel/usr/lib/libpcap.a -D_REENTRANT -o WTP
WTP.o: In function `main':
/home/yang/trunk/capwap-0.93.3/WTP.c:410: undefined reference to `CWWTPReceiveStats'
/home/yang/trunk/capwap-0.93.3/WTP.c:422: undefined reference to `CWWTPReceiveFreqStats'
WTPRunState.o: In function `CWParseVendorMessage':
/home/yang/trunk/capwap-0.93.3/WTPRunState.c:1055: undefined reference to `CWParseVendorPayload'
WTPRunState.o: In function `CWSaveVendorMessage':
/home/yang/trunk/capwap-0.93.3/WTPRunState.c:1275: undefined reference to `CWWTPSaveUCIValues'
/home/yang/trunk/capwap-0.93.3/WTPRunState.c:1285: undefined reference to `CWWTPSaveWUMValues'
collect2: ld returned 1 exit status
make: *** [WTP] Error 1
[root@SS-SERVER1 capwap-0.93.3]#


Makefile内容如下:
KAMIKAZEDIR=/home/yang/openwrt_sdk/OpenWrt-SDK-Linux-i686-1

CC = $(KAMIKAZEDIR)/staging_dir_mipsel/bin/mipsel-linux-gcc

LDFLAGS = $(KAMIKAZEDIR)/staging_dir_mipsel/usr/lib/libssl.a $(KAMIKAZEDIR)/staging_dir_mipsel/usr/lib/libcrypto.a $(KAMIKAZEDIR)/staging_dir_mipsel/lib/libpthread.a $(KAMIKAZEDIR)/staging_dir_mipsel/lib/libdl.a $(KAMIKAZEDIR)/staging_dir_mipsel/usr/lib/libpcap.a -D_REENTRANT

CFLAGS = -Wall -g -O0 -D_REENTRANT -DBCM -I $(KAMIKAZEDIR)/staging_dir_mipsel/usr/include #-DCW_NO_DTLS

# Memory leak
#LDFLAGS += ../dmalloc-5.5.0/libdmallocth.a
#CFLAGS += -DDMALLOC

# Capwap Debugging
CFLAGS += -DCW_DEBUGGING

RM = /bin/rm -f

# list of generated object files for WTP.
WTP_OBJS = WTP.o WTPBcmFrameReceive.o WTPConfigFile.o WTPProtocol.o WTPProtocol_User.o WTPDiscoveryState.o WTPJoinState.o WTPConfigureState.o WTPDataCheckState.o WTPRunState.o WTPRunStateCheck.o WTPRetransmission.o WTPSulkingState.o CWCommon.o CWConfigFile.o CWErrorHandling.o CWSafeList.o CWList.o CWLog.o CWNetwork.o CWProtocol.o CWRandom.o CWSecurity.o CWOpenSSLBio.o CWStevens.o CWThread.o CWBinding.o WTPBinding.o WTPBcmDriverInteraction.o WTPSettingsFile.o timerlib.o

WTP_SRCS = $(WTP_OBJS:.o=.c)

WTP_DEPS := $(WTP_OBJS:.o=.d)

# program executables.
WTP_NAME = WTP

.PHONY: deps clean clean_libs libs

# top-level rule, to compile everything.
all: $(WTP_NAME)

$(WTP_NAME): $(WTP_OBJS)
$(CC) -DWRITE_STD_OUTPUT $(WTP_OBJS) $(CC_FLAGS) $(LDFLAGS) -o $(WTP_NAME)

clean:
$(RM) $(WTP_NAME) $(WTP_OBJS) $(WTP_DEPS)

clean_deps:
$(WTP_DEPS)

deps: $(WTP_SRC)
$(CC) -MD -E -DWRITE_STD_OUTPUT $(WTP_SRCS) $(CFLAGS) >/dev/null

-include $(WTP_DEPS)

...全文
21120 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wyjq395 2010-12-27
  • 打赏
  • 举报
回复
我发现opencapwap下的openssl与openwrt的SDK目录下的openssl版本不一样。
所以我下载了一个和opencapwap下的openssl一样版本的openssl,用openwrt交叉编译,通过。
之后我就用编译出来的libssl.a和libcrypto.a代替原来的openssl,CFLAGS里配置的include的内容也替换了。


接着重新编译opencapwap,发现还缺少pcap的东西。



是不是我做法不对呢,pcap的东西应该不会缺少吧?毕竟之前都编译到最后一步,进行链接的时候出错的。

期待有人指点,呵呵!
wyjq395 2010-12-24
  • 打赏
  • 举报
回复
LDFLAGS = $(KAMIKAZEDIR)/staging_dir_mipsel/usr/lib/libssl.a $(KAMIKAZEDIR)/staging_dir_mipsel/usr/lib/libcrypto.a $(KAMIKAZEDIR)/staging_dir_mipsel/lib/libpthread.a $(KAMIKAZEDIR)/staging_dir_mipsel/lib/libdl.a $(KAMIKAZEDIR)/staging_dir_mipsel/usr/lib/libpcap.a -D_REENTRANT

CFLAGS = -Wall -g -O0 -D_REENTRANT -DBCM -I $(KAMIKAZEDIR)/staging_dir_mipsel/usr/include #-DCW_NO_DTLS

刷新下,还是希望有人能帮忙解答!
帮忙看看这两个设置写的有没有问题,或者会不会缺少了什么库?
wyjq395 2010-12-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 subfate 的回复:]
太复杂了,在下不懂了。
本机编译通过,而交叉编译不通过,会不会是交叉编译器的问题?指向的库?库本身?都有可能。
比如./static/uclibc/libssl.a: could not read symbols: File in wrong format
它提示库的符号不能识别,一个可能的原因是这个库不是交叉编译过的版本。
[/Quote]
还是很感谢您,虽然问题还没解决,但是您的回答对我还是挺有帮助的。
李迟 2010-12-23
  • 打赏
  • 举报
回复
太复杂了,在下不懂了。
本机编译通过,而交叉编译不通过,会不会是交叉编译器的问题?指向的库?库本身?都有可能。
比如./static/uclibc/libssl.a: could not read symbols: File in wrong format
它提示库的符号不能识别,一个可能的原因是这个库不是交叉编译过的版本。
wyjq395 2010-12-23
  • 打赏
  • 举报
回复
如果用原来makefile中的那些.a文件会出现下面的错误:
/home/yang/trunk/staging_dir/toolchain-mips_r2_gcc-4.3.3+cs_uClibc-0.9.31/lib/gcc/mips-openwrt-linux-uclibc/4.3.3/../../../../mips-openwrt-linux-uclibc/bin/ld: ./static/uclibc/libssl.a(d1_srvr.o): Relocations in generic ELF (EM: 3)
./static/uclibc/libssl.a: could not read symbols: File in wrong format
collect2: ld returned 1 exit status
wyjq395 2010-12-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 subfate 的回复:]
因为没有包含声明该函数的那个头文件,至于是哪一个文件,在命令行下man xxx就知道了,包含之。

另外……
[/Quote]
我查看了一下,头函数是#include <semaphore.h>,加进去了结果还是一样,我觉得不会是这个问题,因为不是交叉编译的时候是可以顺利通过的。

没有README文件,INSTALL文件也只是介绍怎么安装的,没有说明库相关的信息。

我用的库的确不是源码中的库,我连接到其它目录下去了。


下面是原来linux直接编译使用的Makefile:


CC = gcc

#LDFLAGS = -lssl -lcrypto -lpthread -ldl -D_REENTRANT
#LDFLAGS = /usr/lib/libefence.a ./static/libssl.a ./static/libcrypto.a -lpthread -ldl -D_REENTRANT
LDFLAGS = ./static/libssl.a ./static/libcrypto.a -lpthread -ldl -D_REENTRANT

CFLAGS = -Wall -g -O0 -D_REENTRANT -I./include/ #-DCW_NO_DTLS

OPENSSL_INCLUDE = #-I/usr/local/ssl/include/ #Openssl include files

# Memory leak
#LDFLAGS += ../dmalloc-5.5.0/libdmallocth.a
#CFLAGS += -DDMALLOC

# Capwap Debugging
CFLAGS += -DCW_DEBUGGING
CFLAGS += -DOPENSSL_NO_KRB5

RM = /bin/rm -f

# list of generated object files for AC.
AC_OBJS = AC.o ACConfigFile.o ACMainLoop.o ACDiscoveryState.o ACJoinState.o ACConfigureState.o ACDataCheckState.o ACRunState.o ACProtocol_User.o ACRetransmission.o CWCommon.o CWConfigFile.o CWErrorHandling.o CWList.o CWLog.o ACMultiHomedSocket.o ACProtocol.o CWSafeList.o CWNetwork.o CWProtocol.o CWRandom.o CWSecurity.o CWOpenSSLBio.o CWStevens.o CWThread.o CWBinding.o CWVendorPayloadsAC.o ACBinding.o ACInterface.o ACSettingsFile.o timerlib.o

# list of generated object files for WTP.
WTP_OBJS = WTP.o WTPFrameReceive.o WTPFreqStatsReceive.o WTPStatsReceive.o WTPConfigFile.o WTPProtocol.o WTPProtocol_User.o WTPDiscoveryState.o WTPJoinState.o WTPConfigureState.o WTPDataCheckState.o WTPRunState.o WTPRunStateCheck.o WTPRetransmission.o WTPSulkingState.o CWCommon.o CWConfigFile.o CWErrorHandling.o CWSafeList.o CWList.o CWLog.o CWNetwork.o CWProtocol.o CWRandom.o CWSecurity.o CWOpenSSLBio.o CWStevens.o CWThread.o CWBinding.o CWVendorPayloadsWTP.o WTPBinding.o WTPDriverInteraction.o WTPSettingsFile.o timerlib.o

WUA_OBJS = WUA.o

AC_SRCS = $(AC_OBJS:.o=.c)
WTP_SRCS = $(WTP_OBJS:.o=.c)
WUA_SRCS = $(WUA:OBJS:.o=.c)

AC_DEPS := $(AC_OBJS:.o=.d)
WTP_DEPS := $(WTP_OBJS:.o=.d)
WUA_DEPS := $(WUA_OBJS:.o=.d)

# program executables.
AC_NAME = AC
WTP_NAME = WTP
WUA_NAME = WUA

.PHONY: deps clean clean_libs libs

# top-level rule, to compile everything.
all: $(AC_NAME) $(WTP_NAME) $(WUA_NAME)

$(AC_NAME): $(AC_OBJS)
$(CC) $(AC_OBJS) $(CC_FLAGS) $(OPENSSL_INCLUDE) $(LDFLAGS) -o $(AC_NAME)

$(WTP_NAME): $(WTP_OBJS)
$(CC) -DWRITE_STD_OUTPUT $(WTP_OBJS) $(CC_FLAGS) $(LDFLAGS) -o $(WTP_NAME)

$(WUA_NAME): $(WUA_OBJS)
$(CC) $(WUA_OBJS) $(CC_FLAGS) $(LDFLAGS) -o $(WUA_NAME)

clean:
$(RM) $(AC_NAME) $(WTP_NAME) $(WUA_NAME) $(AC_OBJS) $(WTP_OBJS) $(WUA_OBJS) $(AC_DEPS) $(WTP_DEPS)

clean_deps:
$(AC_DEPS) $(WTP_DEPS)

deps: $(AC_SRC) $(WTP_SRC)
$(CC) -MD -E $(AC_SRCS) $(CFLAGS) >/dev/null
$(CC) -MD -E -DWRITE_STD_OUTPUT $(WTP_SRCS) $(CFLAGS) >/dev/null

-include $(AC_DEPS)
-include $(WTP_DEPS)


李迟 2010-12-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wyjq395 的回复:]
google一下,出现在这种错误的很多,但情况都不太一样,盼有高手相助。
CWThread.c:466: warning: implicit declaration of function `sem_timedwait'这一句应该没问题吧?
[/Quote]
因为没有包含声明该函数的那个头文件,至于是哪一个文件,在命令行下man xxx就知道了,包含之。

另外,undefined reference之类的问题是没有包含相关的库。这个库你去找找README文件或INSTALL文件之类的文档,看一下有没有说明。反正要找到些什么蛛丝马迹的。
PS:看了下Makefile,有几个库,但不知道是不是相关的,不敢肯定。
wyjq395 2010-12-23
  • 打赏
  • 举报
回复
google一下,出现在这种错误的很多,但情况都不太一样,盼有高手相助。
CWThread.c:466: warning: implicit declaration of function `sem_timedwait'这一句应该没问题吧?

684

社区成员

发帖
与我相关
我的任务
社区描述
智能路由器通常具有独立的操作系统,包括OpenWRT、eCos、VxWorks等,可以由用户自行安装各种应用,实现网络和设备的智能化管理。
linuxpython 技术论坛(原bbs)
社区管理员
  • 智能路由器社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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