问题描述
问题描述common.h定义所有的类型别名和结构体声明,被mass_diffusion.h和heat_conduction.h所引用,mass_diffusion.h和heat_conduction.h被man.cpp所引用,然后编译成功,链接的时候报错LINK2005。我已经使用了#ifndef ... #define ... #endif这种防御性语法;每个文件暴露在外面的只有一个init函数,文件内部虽然都有重名函数,但是他们没有对外暴露为什么还会报错呢?
报错信息visual studio 2017 编译 C++ 报错: LNK2005 mass_diffusion.obj中的'void __cdecl compute(class std::vector<struct user ,class std::allocator<struct user > > ,class std::vector<struct item ,class std::allocator<struct item > > )'已经在 heat_conduction.obj 中定义。
相关代码
//common.h#ifndef _COMMON_H#define _COMMON_H...struct user;struct item;struct relation;...typedef unsigned int _container_number_;typedef unsigned int _value_number_;...typedef std::vector<user*> user_container;typedef std::vector<item*> item_container;#endif // !_COMMON_H...//mass_diffusion.h#include 'common.h'extern void init_md(user_container, item_container);void compute(user_container _ulist, item_container _ilist);...//mass_diffusion.cpp#include 'mass_diffusion.h'void init_md(user_container _ulist, item_container _ilist){...};void compute(user_container _ulist, item_container _ilist) {...};...//heat_conduction.h#include 'common.h'extern void init_hc(user_container _ulist, item_container _ilist);void compute(user_container _ulist, item_container _ilist);...//heat_conduction.cpp#include 'heat_conduction.h'void init_hc(user_container _ulist, item_container _ilist){...};void compute(user_container _ulist, item_container _ilist) {...}; ...//main.cpp#include 'mass_diffusion.h'#include 'heat_conduction.h'
问题解答
回答1:本来就会报错,你各个模块都链接到同一个文件里,链接器一看那么多符号都一个名字自然就gg了,.h里面暴露什么链接器不会管的,解决方法是各个模块独立编译成so或者dll,然后再调用,或者用命名空间