C++ Error: LINK2005

查看:67
本文介绍了C++ Error: LINK2005的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

  1. 问题描述
    common.h定义所有的类型别名和结构体声明,被mass_diffusion.hheat_conduction.h所引用,mass_diffusion.hheat_conduction.hman.cpp所引用,然后编译成功,链接的时候报错LINK2005。我已经使用了#ifndef ... #define ... #endif这种防御性语法;每个文件暴露在外面的只有一个init函数,文件内部虽然都有重名函数,但是他们没有对外暴露为什么还会报错呢?

  2. 报错信息
    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 中定义。

  3. 相关代码

    //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"

解决方案

本来就会报错,你各个模块都链接到同一个文件里,链接器一看那么多符号都一个名字自然就gg了,.h里面暴露什么链接器不会管的,解决方法是各个模块独立编译成so或者dll,然后再调用,或者用命名空间

这篇关于C++ Error: LINK2005的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆