多个 c++ 文件导致"multiple definition"错误?
Multple c++ files causes "multiple definition" error?
我第一次在一个项目中使用多个C++文件。两者都需要包含一个受保护的(#ifndef)头文件。然而,当我这样做时,我会得到一个多重定义错误。
我有两个直接调用头的.cpp文件,一个间接调用(另一个包含它),然后还有两个包含它的头文件。
那么,我需要做些什么来消除这个错误呢?
错误:
obj\Debug\main.o||在函数
Z14sortLibQtyTest4BookS_':| [PATH]miscFuncs.h|16|multiple definition of
sortLibQtyTest(Book,Book)'中
代码:
bool sortLibQtyTest(Book a, Book b){ return a.getQty() > b.getQty(); }
应该提到的是,这并不是唯一一个给我带来问题的函数,可能有十多个,有些并不是那么简短和甜蜜。此外,在多个文件中需要这些函数。
有两个选项可以解决这个多定义问题:将方法标记为内联,或者将定义放在.cpp文件中。
1) 内联标记方法:
// Foo.h
inline bool foo(int i) { return i = 42; }
2) 将定义放入.cpp
文件中:
// Foo.h
inline bool foo(int i); // declaration
// Foo.cpp
bool foo(int i) { return i = 42; } // definition
在第一种情况下,编译器是否实际内联了该方法在这里无关紧要:inline
允许您在头文件中定义非成员函数,而不会破坏一个定义规则。
".cpp"answers".h"后缀在很大程度上是惯例问题。就编译器而言,一行代码来自哪里是无关紧要的。当您将该函数#包含到.cpp文件中时,您正在该.cpp文件实现该函数。
因此,当编译器完成并要求链接器将两个cpp文件中的代码编织在一起时,它会发现一个冲突:两个具有相同名称和指纹的函数(参数和返回)。这是一个错误。
您需要:
a。将实现放在一个源文件中,只需在头中留下一个原型声明
// .h
extern bool sortLibQtyTest(Book a, Book b);
// file1.cpp
bool sortLibQtyTest(Book a, Book b) { /* implementation */ }
b。将函数标记为内联:当你调用函数时,编译器会根据需要插入函数体的副本,这可能会很浪费,但通常编译器可以找到有效的方法。
inline bool sortLibQtyTest(Book a, Book b) { return a.getQty() < b.getQty(); }
c。将函数标记为"静态",这告诉编译器为包含该函数的每个源文件创建该函数的副本,但不将其公开给链接器。如果某些源文件在不使用函数的情况下包含头,编译器必须检测并删除它——并非所有编译器/优化级别都这样做,因此这可能会加倍浪费。
static bool sortLibQtyTest(Book a, Book b) {return a.getQty() < b.getQty(); }
d。避免c的缺点,将其标记为静态内联
static inline bool sortLibQtyTest(Book a, Book b) { return a.getQty() < b.getQty(); }
如果您在"CODE"后面引用的行在头文件中,您可以:
- 将
inline
添加到定义或 - 从标题中删除函数体,并将其放入1个(并且只有1个)源文件中
- 仅在使用 gradle 在 Travis CI 上编译时才"multiple definition" googletest 符号
- Qt5 C++中出现意外"Multiple definition"错误
- "multiple definition of"链接错误
- 编译mbed操作系统程序时"multiple definition of `main'"错误
- C++ 使用生成文件捕获框架'multiple definition'链接器错误
- 'Multiple Definition'错误
- 无缘无故地"Multiple definition"
- 使用 Qt 创建器时出错:"multiple definition" "first defined here"
- C++:" multiple definition of 'mainCRTStartup' "错误等
- "multiple definition of value"在 g++ 中编译具有未初始化全局但不是 gcc 的 C 程序时
- 调试"multiple definition of ..."错误的一般技术?
- 编写仅标头模板库时"Multiple definition of"错误
- C++, multiple definition
- 静态数组类变量"multiple definition" C++
- ffmpeg ndk multiple definition libavcodec.a(golomb.o)
- GNU GCC 编译器错误"multiple definition of main"
- 简单 qtest 失败,'multiple definition of main'
- 多个 c++ 文件导致"multiple definition"错误?
- 如何在多个类中使用库而不会出现"multiple definition"错误
- 使用 -Wall 而不是 -o 时出现"multiple definition of _start"错误