关于error LNK2005的疑问

kingstarer 2010-12-30 11:35:09
test.h的代码如下

int g_funDemo(int a)
{
return 1 + 2;
}

template<typename T>
int g_fun(T mem)
{
return 1 + 2;
}


当同时有两个以上cpp文件包含test.h并调用里面的函数时
g_funDemo的定义会引起链接时出现LNK2005错误
而g_fun的定义则不会

我想不明白的是,为什么编译器不会把这两个一样的g_funDemo合并成一个处理
而是做为一个链接错误报出?

另一个问题是,为什么g_fun格式的定义就不会出现这个链接错误

编译器是怎么处理的? 在每一个.obj文件里面都生成一个static的g_fun

还是能够识别出两个cpp用同一个g_fun,而将它合并?
...全文
69 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2010-12-31
  • 打赏
  • 举报
回复
《程序员的自我修养——链接、装载和库》
kingstarer 2010-12-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 thefirstz 的回复:]
不同的cpp文件会编译成不同的.o文件,然后链接在一起,之前各个.o文件之间并不知道彼此的内容啊,当多次包含的时候链接时就会出错
对于模板不一样,不会编译成obj文件,所以没有这个问题
[/Quote]

其实我不明白的是为什么链接器不会合并这些同名的对象

基于什么考虑的

我试过在aix下面这样做,也会出现链接警告

不过没说明这个警告可能出现什么影响
昵称很不好取 2010-12-31
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 kingstarer 的回复:]
引用 2 楼 thefirstz 的回复:
不同的cpp文件会编译成不同的.o文件,然后链接在一起,之前各个.o文件之间并不知道彼此的内容啊,当多次包含的时候链接时就会出错
对于模板不一样,不会编译成obj文件,所以没有这个问题


如果两个cpp里面都调用了g_fun函数

这个时候编译器会怎么处理? 生成两个g_fun并设定外部不可见?

还是在另一个obj里面生成g_fun……
[/Quote]
两个cpp文件调用g_fun函数时候,不同的编译器处理不同,链接器一般会合并相同的模板实例
可以google 模板编译模式 来进一步了解
kingstarer 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 thefirstz 的回复:]
不同的cpp文件会编译成不同的.o文件,然后链接在一起,之前各个.o文件之间并不知道彼此的内容啊,当多次包含的时候链接时就会出错
对于模板不一样,不会编译成obj文件,所以没有这个问题
[/Quote]

如果两个cpp里面都调用了g_fun函数

这个时候编译器会怎么处理? 生成两个g_fun并设定外部不可见?

还是在另一个obj里面生成g_fun?
無_1024 2010-12-30
  • 打赏
  • 举报
回复
与处理一下就不会出错
这就好比多级继承和多重继承的虚基类的使用的作用
昵称很不好取 2010-12-30
  • 打赏
  • 举报
回复
不同的cpp文件会编译成不同的.o文件,然后链接在一起,之前各个.o文件之间并不知道彼此的内容啊,当多次包含的时候链接时就会出错
对于模板不一样,不会编译成obj文件,所以没有这个问题
就想叫yoko 2010-12-30
  • 打赏
  • 举报
回复
你的test.h有预编译处理吗

65,208

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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