分离式编译时 链接器工具错误 (一个变量被定义一次或多次)

在编写程序时,将类中的函数成员的声明和定义分开,在头文件(.h)中进行声明,在源文件(.cpp)中进行定义

以及具体功能的实现。达到分离式编译的效果,提高代码的可读性。

自己在编写是程序时,程序显示没有错误,但是在生成时,产生了链接器工具错误LNK2005 的错误提示。这个错误

也会导致另外一个错误LNK1169 找到一个或多个多重定义的符号. 原因是在.cpp 文件内定义函数时加上了 inline 

修饰符将函数声明成了内联函数。

内联函数用于优化规模较小,流程直接,频繁调用的函数。通常是将内联函数在每个调用点上“内联地 ”展开。

导致了在编译过程中可能找到一个或多个多重定义的符号这样的编译错误。

但是直接在.h文件内对函数进行定义 加上 inline 修饰符没有问题

eg:

Test.h

#pragma once
#include <string>
using namespace std;

class Test
{
public:
 Test(const string &str) :s(str) {}
 string fun();
private:
 string s;
};

Test.cpp

#include "stdafx.h"
#include "Test.h"

inline
string Test::fun()
{
 return s;
}

这样编写导致程序编译错误,去掉inline后 程序正常运行。

时间: 2025-01-14 16:28:02

分离式编译时 链接器工具错误 (一个变量被定义一次或多次)的相关文章

C++链接器工具错误:LNK2001, LNK2019(转载)

这是归属于链接器工具错误 这一类. 无法解析的外部符号“symbol” 代码引用了链接器无法在库和对象文件中找到的内容(如函数.变量或标签). 可能的原因 代码请求的内容不存在(例如,符号拼写错误或使用错误的大小写). 代码请求的内容错误(使用的是混合版本的库,一些库来自产品的一个版本,而其他则来自另一个版本). 该错误信息之后为致命错误 LNK1120. 具体原因 代码问题 如果 LNK2001 诊断文本报告 __check_commonlanguageruntime_version 是无法解

链接器工具错误 LNK2011

问题描述: 使用visual studio 2015编译apr-iconv失败,提示"链接器工具错误 LNK2011:未链接预编译对象:映像可能不能运行"错误. 原因分析: MSDN关于该错误描述如下(https://msdn.microsoft.com/zh-cn/library/3ay26wa2.aspx): 如果使用预编译头,LINK 要求必须链接所有与预编译头一起创建的对象文件. 如果您有用来生成用于其他源文件的预编译头的源文件,现在必须包括与预编译头一起创建的对象文件.例如,

VS中出现“链接器工具错误,XXX工具模块对于SAFESEH映像是不安全的”的解决方法

1.“调试”菜单->“属性”->“配置属性”->“链接器”->“命令行” 2.在“其它选项”的输入框里输入 /SAFESEH:NO ,点击“应用”

linux 编译时多个源文件生成一个目标文件

obj-m := target.o target-objs :=  src1.o src2.o src3.o linux 编译时多个源文件生成一个目标文件

[VC6]ONMESSAGE()宏编译时出现&quot;sytax error ;&quot;错误时

自定义消息时编译出错,经排查,在定义消息的头文件里 1 #define WM_XXX (WM_USER+1000); 最后多加了一个分号引起. 吐血.

Docker环境编译时的两个错误记录

1)报错一docker-compose -f compose/app.yaml -f compose/backend.yaml -f compose/proxy.yaml build peatio barongERROR: Couldn't connect to Docker daemon at http://localhost:4243 - is it running? If it's at a non-standard location, specify the URL with the D

c++ 编译时检测结构体大小的的宏定义写法

一种写法: template <bool> struct CompileAssert { }; #define COMPILE_ASSERT(expr, msg) \ typedef CompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1] } //endof namespace 第二种写法: 1 #define CAT_TOKEN_1(t1,t2) t1##t2 2 #define CAT_TOKEN(t1,t2) CAT_TOKE

C++应用程序在Windows下的编译、链接(二)COFF/PE文件结构

2.1概述 在windows操作系统下,可执行文件的存储格式是PE格式:在Linux操作系统下,可执行文件的存储格式的WLF格式.它们都是COFF格式文件的变种,都是从COFF格式的文件演化而来的. 在windows平台下,目标文件(.obj),静态库文件(.lib)使用COFF格式存储:而可执行文件(.exe),动态链接库文件(.dll)使用PE格式存储.静态库文件其实就是一堆目标文件的集合. 在“WinNT.h”头文件中定义了COFF格式文件,以及PE格式文件的数据结构.这些定义是一系列的结

VC2010编译时提示:转换到 COFF 期间失败: 文件无效或损坏

有时候新安装好VS2010后编译时就提示上述错误,罗列一下从网上查找到的几种解决方案: 方案1: 点击“项目”-->“属性”--> “清单工具”, 然后选择"输入和输出’--> ‘嵌入清单’,将后面的‘是’改成‘否’就可以了. 方案2:在VS安装目录搜索cvtres.exe发现有两个cvtres.exe文件,有的网友选择用最新的文件覆盖掉所有旧的cvtres.exe,也有网友是删除旧cvtres.exe的文件.我是将旧cvtres.exe 改名字了,以备恢复环境.注意这两个文件