【发布时间】:2016-06-01 20:43:40
【问题描述】:
我正在编写一个 C++ 程序,其中每个文件都有自己的一组全局变量声明。这些文件中的大多数使用在其他文件中使用 extern 定义的全局变量。
这是一个类似于我的程序的示例:
Main.cpp
#include "stdafx.h"
#include <iostream>
#include "Other_File.cpp"
int var1;
int var2;
int main()
{
var1 = 1;
var2 = 2;
otherFunction();
var4 = 4; // From Other_File.cpp
std::cout << var1 << " " << var2 << " " << var3 << " " << var4 << std::endl;
return(0);
}
Other_File.cpp
extern int var1;
extern int var2;
int var3;
int var4;
void otherFunction()
{
var3 = var1 + var2;
var4 = 0;
}
当我在 Visual Studio (Windows) 中构建此代码时,一切运行正常且输出正确。但是当我尝试在 Linux 上使用 g++ 构建时,我收到以下错误:
g++ -o 测试Testing.o Other_File.o Other_File.o:(.bss+0x0):
var3' Testing.o:(.bss+0x0): first defined here Other_File.o:(.bss+0x4): multiple definition ofvar4' 的多重定义 Testing.o:(.bss+0x4): 这里首先定义 Other_File.o: In functionotherFunction()': Other_File.cpp:(.text+0x0): multiple definition ofotherFunction()' Testing.o:Testing.cpp:(.text+0x0): 首先定义 这里 collect2: ld 返回 1 退出状态 make: *** [Testing] Error 1
这是因为我在主文件中“包含”了另一个文件吗?
如果不是,我的代码有什么问题?
编辑:这是我的 Makefile for g++ 的内容:
Testing: Testing.o Other_File.o
g++ -o Testing Testing.o Other_File.o
Testing.o: Testing.cpp
g++ -c -std=c++0x Testing.cpp
Other_File.o: Other_File.cpp
g++ -c -std=c++0x Other_File.cpp
clean:
rm *.o Calculator
【问题讨论】:
-
按照惯例,不应在另一个 cpp 文件中包含 cpp 文件。
-
你传递给 g++ 的命令行是什么?
-
是的,通过包含 cpp 文件,您最终有两次定义 - 在原始 cpp 文件和包含它的文件中(我假设您也在独立编译包含的 cpp 文件)。 您不得包含 CPP 文件。
-
我怀疑您在 Visual Studio 中的项目中只有 Main.cpp,但是在 Linux 上构建时您会编译这两个 cpp 文件。因此,请检查您在 Linux 上编译的确切文件。另请参阅上面 Brian 的评论。
标签: c++ compilation linkage