目标文件有一个概念叫弱符号,链接的时候连接器会只在最终的目标文件中用其中一个,所以不会有链接冲突。C++编译器在编译类中定义的函数的时候就会使用弱符号,例如std::vector的例子:
extern std::vector<int> v;
void test()
{
v.push_back(1);
}
这个编译出来之后的目标文件在 nm -C 中的输出有:
0000000000000000 W std::vector<int, std::allocator<int> >::push_back(int&&)
表明 std::vector<int>::push_back 是弱符号,从而多个用了 std::vector<int>::push_back 的目标文件链接时不会冲突。
楼上提到的 one definition rule 是另一个问题。假如你在不同源文件中定义了相同名字的类,里面有同名同参数类型的函数,那么根据上面的理论,链接是不会出问题的,但是由于这两个函数符号名相同,链接时只用了一个,而函数功能不同,运行时就会出现错误的行为。这种问题只有启用了链接时优化的情况下才能检测出来。这种问题我以前写过一个例子说明:
https://bbs.wehack.space/thread-341.html
【 在 misslost 的大作中提到: 】
: 某些三方库只有header文件,比如 spdlog 等等。
: 如果项目中有 a.cpp b.cpp都include这些header文件,编译之后a.obj b.obj都有函数的实现代码,那么a和b link的时候,不会有冲突吗?
--
修改:ArchLinux FROM 223.72.43.*
FROM 223.72.43.*