为什么我会收到“多重定义”错误?我如何解决它?

2023-12-23

终端给出的命令:

g++ main.cpp 测试.cpp

错误信息:

/tmp/ccvgRjlI.o:在函数“test2()”中:
test.cpp:(.text+0x0): 多个 `test2()' 的定义
/tmp/ccGvwiUE.o:main.cpp:(.text+0x0):首先在这里定义
collect2:错误:ld 返回 1 退出状态 主程序

源代码:

#include "test.hpp"
int main(int argc, char *argv[])
{
    test2();
    return 0;
}

test.hpp

#ifndef _TEST_HPP_
#define _TEST_HPP_

#include <iostream>

void test();
void test2() { std::cerr << "test2" << std::endl; }

#endif

test.cpp

#include "test.hpp"

using std::cerr;
using std::endl;

void test() { cerr << "test" << endl; }

顺便说一句,以下编译良好:

g++ main.cpp


标题test.hpp包含在两个编译单元中。第一个是编译单元main.cpp第二个是编译单元test.cpp.

默认情况下,函数具有外部链接。这意味着具有相同名称和签名的函数在不同编译单元中表示相同的函数。它们应被定义一次。然而在你的程序中函数的定义test2在两个编译单元中找到并且链接器不知道要使用该函数的什么定义。

您可以将该函数声明为内联函数。例如

inline void test2() { std::cerr << "test2" << std::endl; }

在这种情况下,它可以在每个编译单元中定义。

或者,您可以仅将使用函数所做的函数声明放入标头中test并定义它例如test.cpp.

另一种方法是将函数声明为具有内部链接。为此,您可以使用关键字 static 在标头中定义函数

static void test2() { std::cerr << "test2" << std::endl; }

或将其放置在未命名的名称空间中

namespace
{
    void test2() { std::cerr << "test2" << std::endl; }
}

在这种情况下,每个编译单元都会有自己的功能test2.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我会收到“多重定义”错误?我如何解决它? 的相关文章

  • 32 位应用程序的特征最大矩阵大小

    所以 我正在寻找Eigen http eigen tuxfamily org index php title Main Page当我尝试声明大于 10000x10000 的矩阵时 包崩溃 我需要声明一个像这样的矩阵 可靠地大约有 13000
  • 为什么要序列化对象需要 Serialized 属性

    根据我的理解 SerializedAttribute 不提供编译时检查 因为它都是在运行时完成的 如果是这样 那么为什么需要将类标记为可序列化呢 难道序列化器不能尝试序列化一个对象然后失败吗 这不就是它现在所做的吗 当某些东西被标记时 它会
  • POCO HTTPSClientSession 发送请求时遇到问题 - 证书验证失败

    我正在尝试使用 POCO 库编写一个向服务器发出 HTTPS 请求的程序 出于测试目的 我正在连接到具有自签名证书的服务器 并且我希望允许客户端进行连接 为了允许这种情况发生 我尝试安装InvalidCertificateHandler这是
  • 当前的 c++ 工作草案与当前标准有何不同

    通过搜索该标准的 PDF 版本 我最终找到了这个链接C 标准措辞草案 http www open std org jtc1 sc22 wg21 docs papers 2012 n3376 pdf从 2011 年开始 我意识到我可以购买最终
  • 如何从网站下载 .EXE 文件?

    我正在编写一个应用程序 需要从网站下载 exe 文件 我正在使用 Visual Studio Express 2008 我正在使用以下代码 private void button1 Click object sender EventArgs
  • 如何将“外部模板”与由同一类中的模板化成员使用的嵌套类一起使用?

    首先 一些背景信息 我尝试以 Herb Sutter 在他的解决方案中介绍的方式使用 Pimpl 习语 得到了 101 http herbsutter com gotw 101 这在头文件中看起来像这样 include pimpl h h
  • 在 2D 中将一个点旋转另一个点

    我想知道当一个点相对于另一个点旋转一定角度时如何计算出新的坐标 我有一个块箭头 想要将其相对于箭头底部中间的点旋转角度 theta 这是允许我在两个屏幕控件之间绘制多边形所必需的 我无法使用和旋转图像 从我到目前为止所考虑的情况来看 使问题
  • Qt 创建布局并动态添加小部件到布局

    我正在尝试在 MainWindow 类中动态创建布局 我有四个框架 它们是用网格布局对象放置的 每个框架都包含一个自定义的 ClockWidget 我希望 ClockWidget 对象在调整主窗口大小时相应地调整大小 因此我需要将它们添加到
  • 如何重置捕获像素的值

    我正在尝试创建一个 C 函数 该函数返回屏幕截图位图中每四个像素的 R G 和 B 值 这是我的代码的一部分 for int ix 4 ix lt 1366 ix ix 4 x x 4 for int iy 3 iy lt 768 iy i
  • 为什么我不应该对不是由 malloc() 分配的变量调用 free() ?

    我在某处读到 使用它是灾难性的free删除不是通过调用创建的对象malloc 这是真的 为什么 这是未定义的行为 永远不要尝试它 让我们看看当您尝试时会发生什么free 自动变量 堆管理器必须推断出如何获取内存块的所有权 为此 它要么必须使
  • 通过 NHibernate 进行查询,无需 N+1 - 包含示例

    我有一个 N 1 问题 我不知道如何解决它 可以在这个问题的底部找到完全可重复的样本 因此 如果您愿意 请创建数据库 设置 NUnit 测试和所有附带的类 并尝试在本地消除 N 1 这是我遇到的真实问题的匿名版本 众所周知 这段代码对于帮助
  • 当“int”处于最大值并使用 postfix ++ 进行测试时,代码定义良好吗?

    示例 未定义行为的一个示例是整数溢出的行为 C11dr 3 4 3 3 int溢出是未定义的行为 但这是否适用于存在循环的以下内容 并且不使用现在超出范围的副作用i 特别是 这是否后缀增量规格帮助 结果的值计算在副作用之前排序 更新操作数的
  • 获取 2 个数据集 c# 中的差异

    我正在编写一个简短的算法 它必须比较两个数据集 以便可以进一步处理两者之间的差异 我尝试通过合并这两个数据集并将结果更改放入新的数据集来实现此目标 我的方法如下所示 private DataSet ComputateDiff DataSet
  • 有没有一种简单的方法可以让 Visual Studio 2015 使用特定的 ToolsVersion?

    使用特定版本构建项目或解决方案时msbuild我可以使用以下命令选择早期的 net 工具链 toolsversion or tv switch C Program Files x86 MSBuild 14 0 bin msbuild tv
  • 耐用功能是否适合大量活动?

    我有一个场景 需要计算 500k 活动 都是小算盘 由于限制 我只能同时计算 30 个 想象一下下面的简单示例 FunctionName Crawl public static async Task
  • 当前的 x86 架构是否支持非临时加载(来自“正常”内存)?

    我知道有关此主题的多个问题 但是 我没有看到任何明确的答案或任何基准测量 因此 我创建了一个处理两个整数数组的简单程序 第一个数组a非常大 64 MB 第二个数组b很小 无法放入 L1 缓存 程序迭代a并将其元素添加到相应的元素中b在模块化
  • 为什么拆箱枚举会产生奇怪的结果?

    考虑以下 Object box 5 int int int box int 5 int nullableInt box as int nullableInt 5 StringComparison enum StringComparison
  • 结构体指针的动态数组

    我必须使用以下代码块来完成学校作业 严格不进行任何修改 typedef struct char firstName char lastName int id float mark pStudentRecord pStudentRecord
  • 双精度类型二维多维数组的 pinvoke 编组作为 c# 和 c++ 之间的输入和输出

    我有以下我正在尝试解决的双物质类型的 2d 多维数组的 c 和 c pinvoke 编组 我已经查看了以下热门内容以获得我目前拥有的内容使用双精度数组进行 P Invoke 在 C 和 C 之间编组数据 https stackoverflo
  • 用于 C# XNA 的 Javascript(或类似)游戏脚本

    最近我准备用 XNA C 开发另一个游戏 上次我在 XNA C 中开发游戏时 遇到了必须向游戏中添加地图和可自定义数据的问题 每次我想添加新内容或更改游戏角色的某些值或其他内容时 我都必须重建整个游戏或其他内容 这可能需要相当长的时间 有没

随机推荐

  • 计算iTextSharp PDF文档的高度?

    使用iTextSharp时如何计算PDF文档的高度 我正在使用 iTextSharp 使用绝对位置在 PDF 文档上定位各种图像 不过我注意到了SetAbsolutePosition 定位Y参数来自底部 所以我需要计算高度才能执行以下操作
  • MongoDB MapReduce是否锁定数据库

    MongoDB MapReduce 作业是否会锁定数据库 我正在开发一个多用户 MongoDB Web 应用程序 并且担心多用户冲突和性能 有人能给我一些至理名言吗 简单的回答 有时 这在很大程度上取决于您如何使用map reduce 但根
  • Electron:删除 beforeunload 事件监听器

    我有一个电子应用程序 用于显示我无法控制的网页 该应用程序的使用是为了每隔几秒钟就可以显示一个不同的页面 显示的页面之一附加了一个 beforeunload 监听器 如下所示 window addEventListener beforeun
  • 如何获取winexec或shellexecute中执行的Handle?

    我用来创建像 winexec Hand 这样的自定义函数 它将返回执行的应用程序的句柄 我确实使用了 findwindow 但如果它更改窗口标题就会出现问题 没有一种通用方法可以获取应用程序的 该 窗口句柄 因为不能保证任何程序都有一个窗口
  • 在 v23 上找不到符号 Manifest.permission.WRITE_EXTERNAL_STORAGE

    我使用以下 build gradle 文件编译代码 android compileSdkVersion 23 buildToolsVersion 23 0 1 defaultConfig applicationId com example
  • 作曲家权限被拒绝(公钥)

    我在 BitBucket 上有一个私人存储库 我尝试使用composer install在本地主机上安装 这是我的composer json文件 repositories type git url email protected cdn c
  • 初始化函数的目的

    我经常看到构造函数只调用 init 函数 如果您可以将 init 函数的内容放入构造函数中 为什么还要使用 init 函数呢 每个实例仅调用对象的构造函数一次 而 init 函数可能会调用多次 考虑以下代码 public class Foo
  • 使用 JLayeredPane 将多个 JPanel 添加到一个 JPanel 中

    我正在尝试将多个面板添加到另一个面板 我希望它们位于彼此之上 因此我使用 JLayeredPane 我为每个按钮添加了一个按钮 工作时应该出现两个按钮 import java awt Color import javax swing JBu
  • 如果UDF公式失败,Excel VBA保留原始值

    在各个单元格中 我有一个引用 UDF 的指定公式 getValueFromWorkbook OtherWorkbook 10 The getValueFromWorkbookUDF 大致做了类似的事情 Function getValueFr
  • 子域重定向到另一台服务器

    我有一个通过共享托管计划托管的网站 我的域名是在GoDaddy注册的 域名服务器是我的共享主机的域名服务器 到目前为止 一切正常 但我试图弄清楚如何添加子域并将其指向其他地方 我想将 sub mydomain com 指向其他一些 IP 在
  • 与 .pub 文件的 SSH 连接

    我从客户那里得到了 id rsa pub 我被告知要连接到它 我尝试添加密钥ssh copy id email protected cdn cgi l email protection 但它给出了错误 Permission denied p
  • 按语法解析为 AST(或 .y+.lang => xml)的工具

    给定一个词法分析器定义文件 一个语法文件 例如 postgresql y lflex 和 bison 程序来自它的源树 以及由这些词法分析器和解析器定义的文件 例如 SQL 查询 以某种标准形式 例如 XML 的 JSON 获取 AST 该
  • 提取 XSLT 中单引号之间的文本

    需要在之后提取文本单引号 E g div show div 变量是这样的
  • 使用 .gitignore 忽略 node_modules

    我使用 npm 启动了一个项目 添加了一些依赖项 然后使用ignit初始化了存储库git init 我想要目录node modules被git忽略 所以我将它添加到 gitignore像这样文件 gitignore node modules
  • 如何更新它以使用最新版本的引导程序?

    我对中演示的功能感兴趣这把小提琴 http jsfiddle net hcL4s 用于显示模式对话框 敲除结合是 Custom binding for making modals ko bindingHandlers bootstrapMo
  • 什么是 C++ 模块权限?

    我在 C 模块的上下文中看到了一些对术语 权限 的引用 例如https gcc gnu org wiki cxx modules https gcc gnu org wiki cxx modules Baz Baz s declaratio
  • Android - 我似乎没有 ANIM 文件夹或 MAINANIM.xml 文档...这是为什么?

    无论我在 res 目录中查找什么 都只有 main xml 并且我应该有 res anim mainanim xml 但我没有它 我的代码在这里 逐帧动画 https stackoverflow com questions 3290290
  • 从服务器下载和保存大量图像时出现 iOS 内存问题 (ARC)

    以下代码从服务器下载 700 多个不同大小的图像 这里的问题是内存 即使使用 ARC 永远不会释放 最终会出现内存警告 然后应用程序退出 我已经在这个方法中尝试过 autoreleasepool 但似乎不起作用 另外 我尝试在不同位置停止
  • 为什么我在使用 np.nan 时得到 nan 作为字符串,而在使用 pd.NA 时得到缺失值?

    抱歉 我无法共享数据 我尝试制作测试数据 但它没有给出相同的错误或不同的缺失值 如下所述 在底部添加了更多信息pd NA 我正在用代码加载数据 df pd read csv C data csv 加载数据时我收到此警告 C Users Us
  • 为什么我会收到“多重定义”错误?我如何解决它?

    终端给出的命令 g main cpp 测试 cpp 错误信息 tmp ccvgRjlI o 在函数 test2 中 test cpp text 0x0 多个 test2 的定义 tmp ccGvwiUE o main cpp text 0x