零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门
零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言 pthread
零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C++ 面向对象
零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C++ 设计模式
零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C++ STL
零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C/C++ 技术杂谈
零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C/C++ 常用函数
一.error LNK2005:”XXX已经在 XXX.obj 中定义
1.C/C++ 中,当头文件定义变量时,可能会发生 error LNK2005。 例如,如果在项目中的多个源文件中包括此头文件,则会导致错误
// LNK2005_global.h
int global_int; // LNK2005
解决办法:
方案一:在头文件中声明 变量,然后定义它,并选择性地在一个且只有一个源文件中
extern int global_int;
初始化它int global_int = 17;
此变量现在是全局变量,可以通过声明在任何源文件中使用它,例如,通过extern
包括头文件。 对于必须是全局变量的变量,我们建议采用此解决方案,但良好的软件工程实践可最大程度地减少全局变量。方案二:声明 static 静态变量, 这会将定义的范围限制为当前对象文件,并允许多个对象文件具有其自己的变量副本。 不建议在头文件中定义静态变量,因为可能会与全局变量混淆。 倾向于将静态变量定义移动到使用它们的源文件中。
2.当头文件定义不是 的函数时,可能会发生 error LNK2005 。 如果在多个源文件中包括此头文件,则可执行文件中会有多个函数定义。
// LNK2005_func.h
int sample_function(int k) { return 42 * (k % 167); } // LNK2005
解决办法:
方案一:将 static
inline
关键字添加到 函数:static
inline
int sample_function(int k) { return 42 * (k % 167); }方案二:从头文件中删除函数体并仅保留 声明,然后在一个且只有一个源文件中实现函数
//.h头文件
int sample_function(int k);
//.cpp文件
int sample_function(int k) { return 42 * (k % 167); }
二.猜你喜欢
- C语言 数组下标越界和内存溢出区别
- C语言 使用指针遍历数组
- C语言 指针和数组区别
- C语言 指针数组和数组指针区别
- C语言 野指针
- C语言 函数值传递和址传递
- 函数不定长参数
- C语言 函数指针
- C语言 指针函数
- C语言 回调函数 callback
- C语言 #pragma once
- C语言 #include <> 与 #include “” 区别
- C语言 const 修饰函数参数
- C语言 const 和 define 区别
- C语言 va_start / va_end / va_arg 自定义 printf 函数
- C语言 main 函数参数 main(int argc, char *argv[])
- C语言 结构体struct简介(一)
- C语言 结构体struct定义和使用(二)
- C语言 结构体struct数组(三)
- C语言 结构体struct指针(四)
- C语言 结构体struct成员函数(五)
- C语言 结构体struct嵌套(六)
- C语言 结构体struct值传递和址传递(七)
- C/C++ error: cannot assign to non-static data member within const member function ‘xxxx’
- C++ 关于类中 const 的使用
- C/C++ =delete
- C/C++ 条件编译 #ifdef
- C/C++ error C2065: “M_PI”: 未声明的标识符
- C/C++ error C2027: 使用了未定义类型“std::tuple”
- C/C++ vs 没有匹配 if 的非法 else 问题解决办法
- C/C++ Visual studio 中文注释导致编译不能通过
- C/C++ error C2589: “(”: “::”右边的非法标记
- C/C++ error:表达式是必须修改的左值
- C/C++ error C4996: ‘getch’: The POSIX name for this item is deprecated. Instead, use the ISO C++ conf
- C/C++ error C4146: 一元负运算符应用于无符号类型,结果仍为无符号类型
- C/C++ std::string 字符串分割
- C/C++ std::string 使用介绍
- Visual Studio 中 dumpbin 工具使用
- C/C++ error LNK2005:”XXX已经在 XXX.obj 中定义
ChatGPT 3.5 国内中文镜像站免费使用啦
暂无评论内容