当前位置:  编程技术>c/c++/嵌入式

文件编译时出现multiple definition of 'xxxxxx'的具体解决方法

    来源: 互联网  发布时间:2014-10-18

    本文导语:  问题:原来有单个文件tcpclient.c,运行gcc -o tcpclient tcpclient.c可以顺利完成编译,并能与下载到目标板中的tcpserver成功通讯;现在把tcpclient.c中的底层通讯部分抽取出来,单独放到一个文件中nettrans.c中,并有netrans.h作为头文件;...

问题:
原来有单个文件tcpclient.c,运行gcc -o tcpclient tcpclient.c可以顺利完成编译,并能与下载到目标板中的tcpserver成功通讯;
现在把tcpclient.c中的底层通讯部分抽取出来,单独放到一个文件中nettrans.c中,并有netrans.h作为头文件;
然后,使用命令
代码如下:

gcc -o tcpclient nettrans.c tcpclient.c

编译,也总能成功编译。
但是,使用Makefile来编译,总是出现如下multiple definition of类的错误:
代码如下:

dingq@u1110-120628:~/hwsvn/2sw/1prj_linux/pdu/src/branches/pdu-isocket/isocket$ make
gcc  nettrans.o tcpclient.o -o tcpclient
tcpclient.o: In function `nettrans':
/home/dingq/hwsvn/2sw/1prj_linux/pdu/src/branches/pdu-isocket/isocket/nettrans.c:30: multiple definition of `nettrans'
nettrans.o:/home/dingq/hwsvn/2sw/1prj_linux/pdu/src/branches/pdu-isocket/isocket/nettrans.c:30: first defined here
/usr/lib/gcc/i686-linux-gnu/4.6.1/../../../i386-linux-gnu/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
collect2: ld returned 1 exit status
make: *** [client] Error 1

Makefile的内容:
代码如下:

CC = gcc
CROSS_COMPILE = arm-linux-
CROSS_CC = $(CROSS_COMPILE)gcc
CCFLAGS = -g3 -Wall -o0
LDFLAGS =
RM = -rm -rf
SRC_CLIENT = nettrans.c tcpclient.c
SRC_SERVER = tcpserver.c
OBJ_CLIENT = $(SRC_CLIENT:%.c=%.o)
OBJ_SERVER = $(SRC_SERVER:%.c=%.o)
.PHONY : all
all : client
$(OBJ_CLIENT) : $(SRC_CLIENT)
 $(CC) $(CCFLAGS) -c $< -o $@
$(OBJ_SERVER) : $(SRC_SERVER)
 $(CROSS_CC) $(CCFLAGS) -c $< -o $@
client : $(OBJ_CLIENT)
 $(CC) $(LDFLAGS) $(OBJ_CLIENT) -o tcpclient
server : $(OBJ_SERVER)
 $(CROSS_CC) $(LDFLAGS) $(OBJ_SERVER) -o tcpserver
.PHONY : clean
clean :
 $(RM) *.o tcpclient tcpserver

解决办法:
1. 使用普通命令编译可以成功,但是使用Makefile就不成功,说明问题出在Makefile上;
再仔细检查Makefile具体的编译执行过程:
代码如下:

dingq@u1110-120628:~/hwsvn/2sw/1prj_linux/pdu/src/branches/pdu-isocket/isocket$ make clean;make
rm -rf *.o tcpclient tcpserver
gcc -g3 -Wall -o0 -c nettrans.c -o nettrans.o
gcc -g3 -Wall -o0 -c nettrans.c -o tcpclient.o
gcc  nettrans.o tcpclient.o -o tcpclient
tcpclient.o: In function `nettrans':
/home/dingq/hwsvn/2sw/1prj_linux/pdu/src/branches/pdu-isocket/isocket/nettrans.c:30: multiple definition of `nettrans'
nettrans.o:/home/dingq/hwsvn/2sw/1prj_linux/pdu/src/branches/pdu-isocket/isocket/nettrans.c:30: first defined here
/usr/lib/gcc/i686-linux-gnu/4.6.1/../../../i386-linux-gnu/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
collect2: ld returned 1 exit status
make: *** [client] Error 1

原来生成nettrans.o和tcpclient.o都使用了相同的源文件nettrans.c;
所以,是Makefile中
代码如下:

$(OBJ_CLIENT) : $(SRC_CLIENT)
 $(CC) $(CCFLAGS) -c $< -o $@

这个地方出了问题,应该使用模式规则来进行目标文件和依赖文件的匹配;
更改Makefile如下:
代码如下:

CC = gcc
CROSS_COMPILE = arm-linux-
CROSS_CC = $(CROSS_COMPILE)gcc
CCFLAGS = -g3 -Wall -o0
LDFLAGS =
RM = -rm -rf
SRC_CLIENT = nettrans.c tcpclient.c
SRC_SERVER = tcpserver.c
OBJ_CLIENT = $(SRC_CLIENT:%.c=%.o)
.PHONY : all
all : client
%.o : %.c
 $(CC) $(CCFLAGS) -c $< -o $@
client : $(OBJ_CLIENT)
 $(CC) $(LDFLAGS) $(OBJ_CLIENT) -o tcpclient
server : $(OBJ_SERVER)
 $(CROSS_CC) $(CCFLAGS) -c $(SRC_SERVER) -o $(OBJ_SERVER)
 $(CROSS_CC) $(LDFLAGS) $(OBJ_SERVER) -o tcpserver
.PHONY : clean
clean :
 $(RM) *.o tcpclient tcpserver

重新编译,成功生成tcpclient。
问题解决。

    
 
 

您可能感兴趣的文章:

  • 编译内核时出现同名文件该怎么解决
  • 用resin+smartupload上传大文件时出现问题。。。。。。(50分)
  • fwrite写文件时出现乱码
  • 在装LINUX时出现未找到创建新文件的有效设备
  • 解析XML文件时出现如下错误,请教大家可能是什么原因???
  • 移动文件时出现 Directory not empty错误是什么意思?
  • 下载spca5xx.o文件到开发板中,加载时出现了一点问题
  • 执行一个自己开发的一个./cmdsubmit可执行文件时出现: /usr/lib/libstdc++.so.5: version `GLIBCPP_3.2.2' not found (required by ./cmd
  • linux gcc时出现读写文件的error
  • 求助:使用jaxp中的dom接口解析xml文件时出现错误(不会迟于5月23日结账)
  • 比较详细的完美解决安装sql2000时出现以前的某个程序安装已在安装计算机上创建挂起的文件操作。 原创
  • linux启动时出现文件系统检测错误,请问如何解决?谢谢
  • doc文件上传后,下载时出现的问题?希望得到指点
  • 用sevrlet打开一个PDF文件时出现的问题?
  • 我昨天刚学java用的是JBuilder可是我用F9运行之后在classes目录中生成的.class文件为什么我在用java.exe application1时出现如下的错误呢
  • 获取硬件信息的源代码:在遍历文件链表时出现段错误,请高手指教!
  • 比较详细的完美解决安装sql2000时出现以前的某个程序安装已在安装计算机上创建挂起的文件操作。 原创 iis7站长之家
  • 紧急求助!包含内核头文件时出现大量的错误!!!!!!!!!不甚感谢!!!!!!
  • 利用模块,在/proc文件系统下创建文件,并读写时出现错误
  • [提问]Linux下如何把多个.a文件编译一个.so文件,或者把多个.so文件编译成一个.so文件
  • 用JCreator写了一个小程序,有十几个class,当修改某个文件重新编译,javac并没有编译修改的文件,请问要如何做javac才会重新编译所有的
  • jbuilder运行时会编译整个工程的文件,请问大家如何改成只编译当前文件。
  • 如何使用arm-uclibc-gcc将.c文件编译生成.a,将.c文件编译生成.cgi?
  • 用jdk编译Java能不能让编译生成的.class文件自动保存到一个文件夹下?
  • 请教关于用c编译出来的.a文件和用c++编译出来的.a文件的互用问题
  • 菜鸟问题: redhat linux 编译一个最简单的c程序, 其中包含了<studio.h>头文件,但在gcc编译时,提示找不到studio.h文件,请问各位大大
  • 请教:有没有把java编译好的.java和.class文件编译成各个平台下的可执行文件??.exe?着急着急
  • 编译qt-x11,最后编译生成可执行文件时候,make出错
  • 请问哪里有反编译.class文件的反编译器?
  • 在linux下用proc编译程序,'*.pc'文件编译后成了'*.c?',多了一个问号?
  • 定时跑脚本编译C文件就报错,手动跑脚本就编译成功了.
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++ I/O 成员 eof():如果处于文件结尾处则返回true
  • Shell脚本如何递归现实一个文件夹中的文件(文件夹中含有文件夹)
  • WinDows8最新版文件夹加密
  • 求命令:什么命令可以把文件夹下所有的文件按修改时间先后排出来,包括子文件夹里的文件。
  • sharepoint 2010 使用STSNavigate函数实现文件下载举例
  • 请问:proc中的头文件中能包含头文件吗?(感觉如果头文件中包含头文件的话,在链接时就会有错误啊)
  • python异常信息堆栈输出到日志文件
  • 我要实现当进程打开文件时,根据文件名判断是否符合要求,符合后处理文件,再把文件返回给进程,怎么实现啊
  • Centos6下安装Shell下文件上传下载rz,sz命令
  • vi 中编辑两个文件,怎样从其中一个文件拷一段内容到另一个文件中。(同时打开两个文件)
  • 在MyEclipse中设开启xml文件自动提示和自动完成功能
  • 怎么统计一个文件夹下有多少个文件(不包括文件夹)
  • 修改配置真正解决php文件上传大小限制问题(nginx+php)
  • 请教高手一个简单问题:给定一个文件名,如何去查找该文件正在被几个程序使用,并怎么样才可以切断这个文件与正在打开该文件的程序之间的
  • 修改配置真正解决php文件上传大小限制问题(apache+php)
  • linux 下的 .a 文件 .o 文件 是什么文件?各有什么作用?
  • MyEclipse如何查看和设置文件编码格式相关操作
  • 如何用socket一次传输多个文件,如何确定文件一个文件结束
  • 使用libpcap读取tcpdump抓取的文件并解析c代码实例
  • 如何删除某个目录下除了指定文件夹之外的所有文件和文件夹
  • 设置sharepoint 2010文档库中的 pdf文件在浏览器中访问的打开方式
  • solaris文件系统删除文件后文件夹大小不变


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3