首页
社区
课程
招聘
[讨论]vc关于链接obj文件的疑问
发表于: 2013-1-23 01:07 8404

[讨论]vc关于链接obj文件的疑问

2013-1-23 01:07
8404
A.C
B.C

A.C
#include "b.c"
然后引用了B的某些函数

按照正常情况,编译后,应该是A.OBJ,和B.OBJ,
然后LINK 文件,链接到一起,组成exe文件,对吗?

但是我通过dumpbin /symbols xx.obj查看了A.obj发现 里面有B.C文件的函数,
然后link的时候编译器提示出现,符号重定义的问题
fatal error LNK1169: one or more multiply defined symbols found

B里面的函数应该是在B的obj文件里面才对,为什么A.OBJ里面也会存在他的函数定义呢?
难道是.C文件的原因吗?

如果,只在A.c #include "b.c",而把b.c从source file里面移除,然后编译,就没问题.我想问一下,为什么得这么编译才可以?我的意思是说,我知道两个文件在一起编译,会出现符号重定义的问题,但是为什么,我其他文件也没出现过这种文件.为什么这种文件出现这个问题。

如何解决这个问题呢?

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 73
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
你把它include进去了,a.obj当然就有了b.c中的函数定义了,链接器会在a.obj和b.obj都找到函数定义
2013-1-23 02:30
0
雪    币: 174
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
#include "b.c" 只是简单的把 b.c 的内容复制到 #include 的位置,
所以a.c的代码包括了b.c的。自然就会重复定义了。
2013-1-23 08:54
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
a.obj里有b.obj某些东西
2013-1-23 11:30
0
雪    币: 144
活跃值: (42)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
经过楼上几位的帮助和我自己的分析,知道问题所在了。
楼上几位所说的对.
#include只是简单的把文件,包含到当前位置

假设
A.C
B.C
_____________________________
A.C:
void str_printf()
{
printf("this is \"a\" file\r\n");
}

B.C:
#include "A.C"

int main()
{
str_printf();
}

_____________________________
然后编译的时候,
B.C
就会形成下列的样子:
void str_printf()
{
printf("this is \"a\" file\r\n");
}
int main()
{
str_printf();
}

相当于A.C的内容全部包含到了B.C,那么很明显B.OBJ,肯定就包含了A.C文件的实现.
这个时候
A.C编译后同样有一个str_printf函数的定义,然后A.OBJ也存在str_printf的定义.
所以就会存在符号重定义的问题
two.obj : error LNK2005: "void __cdecl Add(int &)" (?Add@@YAXAAH@Z) already defined in DataType.obj
Debug/DataType.exe : fatal error LNK1169: one or more multiply defined symbols found

这个时候在B.C
只包含A.h这个头文件.
但是包含文件的时候
#include "stdafx.h"
#include <iostream>
#include "two.h"

这样的包含顺序才可以编译,如果"two.h"放在stdafx.h前面
error C2065: 'Add' : undeclared identifier
会出现找不到外部函数定义的问题.

从source file,移除A.c 再次编译,就不会出重定义的问题,因为,这个时候只会编译B.C,并不会再编译A.c
当然就不会出现,符号重定义的问题
#include "stdafx.h"
#include <iostream>
#include "two.cpp"

或者
#include "stdafx.h"
#include "two.cpp"
#include <iostream>

这样包含文件,都可以编译OK
________________________________________________________________
但是如果先包含这个文件.
#include "two.cpp"
#include "stdafx.h"
#include <iostream>

DataType.cpp(25) : error C2065: 'Add' : undeclared identifier
就会出现找不到函数的问题.总之不管是实现文件,还是头文件,只要放到stdafx.h前面,就无法编译
至于为什么出现这个问题,我还没研究明白.希望哪位懂这个,给解答一下
________________________________________________________________
2013-1-23 17:45
0
雪    币: 73
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
stdafx.h包含很多重要的头文件,其中有不少定义是其他库(如iostream)和自定义(如你的DataType.cpp)库所必须的,所以你必须把stdafx.h放在前面,后面的一系列定义才能有效,不知道这样解释是否清楚?
2013-1-24 00:29
0
雪    币: 144
活跃值: (42)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
stdafx.h 只包含了<stdio.h> 这也只是一个基本输入输出库,如果不用,不包含也是可以的.

iostream是在我的CPP文件包含的
stdafx.h也没有任何DataType库所必须的信息..

所以,你这个解释,不正确.
2013-1-24 14:29
0
雪    币: 73
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
你的问题是'Add'在使用前没有声明,那声明到底在什么地方?查查就知道了
2013-1-24 20:16
0
游客
登录 | 注册 方可回帖
返回
//