在 g++ 5 上编译 windows c++ 项目时出现问题
Problems compiling windows c++ project on g++ 5
我在 Visual Studio 2013 年内在 Windows 机器上成功创建和编译的 C++ 项目遇到了问题。目前我正在将源代码迁移到 Unix 平台(我的问题已在 Mac 和 CentOs 上得到确认)。我的项目依赖于 OpenMP(多线程支持)库。因此 Apples LLVM 编译器(版本 6.0)不充分支持 OpenMp 我决定使用 g++-5
.
编译我的项目
在从 windows 编译器转移到 GNU 的 gcc/g++ (Homebrew gcc 5.2.0) 时处理了一些语法错误后,我在链接过程中遇到了以下问题:
链接器找不到我的体系结构的符号,并列出了几乎所有由我创建和包含的 class/object - 奇怪的是,它没有列出我的每个 classes/object.
我正在使用此命令进行编译:
g++-5 myProject.cpp -o myProject -fopenmp -std=c++11 -L/usr/local/lib -I/usr/local/Cellar/libiomp/20150701/include/libiomp -Wall
我在编译器调用中是否遗漏了一些愚蠢的东西?我的链接器问题的原因是什么?
如上所述,同样的问题也发生在 Mac 和 CentOs 上。
编辑 (根据一些评论):
根据 this question,我已经激活了所有警告标志,编译器对我的代码非常满意。但是链接器说的是:
Undefined symbols for architecture x86_64:
"FileHelper::createFileName[abi:cxx11](char const*, char const*)", referenced from:
_main in ccZAvFqT.o
"Statistics::writeStats(char const*)", referenced from:
_main in ccZAvFqT.o
"Statistics::newSimulationRun()", referenced from:
_main in ccZAvFqT.o
"Statistics::newSimulationIteration()", referenced from:
_main in ccZAvFqT.o
"Statistics::Instance()", referenced from:
_main in ccZAvFqT.o
"Statistics::writeAvg()", referenced from:
_main in ccZAvFqT.o
"Statistics::~Statistics()", referenced from:
_main in ccZAvFqT.o
"GraphHelper::Graph::writeGraph(std::vector<IPeer*, std::allocator<IPeer*> >*, std::vector<Connection*, std::allocator<Connection*> >*)", referenced from:
[...] and so on and so on...
当您从命令行编译时,您需要确保在 link 可执行文件时包含所有目标文件 (.o)。
显然,这很难手动控制,这就是为什么人们发明了各种 Makefile 来为他们做这件事。你可以研究这个话题。为了解决您眼前的问题,只需确保您的所有 cpp 文件都列在命令行中以供编译。像
g++ myProject.cpp Statistics.cpp ... <flags> -o <executable>
我在 Visual Studio 2013 年内在 Windows 机器上成功创建和编译的 C++ 项目遇到了问题。目前我正在将源代码迁移到 Unix 平台(我的问题已在 Mac 和 CentOs 上得到确认)。我的项目依赖于 OpenMP(多线程支持)库。因此 Apples LLVM 编译器(版本 6.0)不充分支持 OpenMp 我决定使用 g++-5
.
在从 windows 编译器转移到 GNU 的 gcc/g++ (Homebrew gcc 5.2.0) 时处理了一些语法错误后,我在链接过程中遇到了以下问题:
链接器找不到我的体系结构的符号,并列出了几乎所有由我创建和包含的 class/object - 奇怪的是,它没有列出我的每个 classes/object.
我正在使用此命令进行编译:
g++-5 myProject.cpp -o myProject -fopenmp -std=c++11 -L/usr/local/lib -I/usr/local/Cellar/libiomp/20150701/include/libiomp -Wall
我在编译器调用中是否遗漏了一些愚蠢的东西?我的链接器问题的原因是什么? 如上所述,同样的问题也发生在 Mac 和 CentOs 上。
编辑 (根据一些评论): 根据 this question,我已经激活了所有警告标志,编译器对我的代码非常满意。但是链接器说的是:
Undefined symbols for architecture x86_64:
"FileHelper::createFileName[abi:cxx11](char const*, char const*)", referenced from:
_main in ccZAvFqT.o
"Statistics::writeStats(char const*)", referenced from:
_main in ccZAvFqT.o
"Statistics::newSimulationRun()", referenced from:
_main in ccZAvFqT.o
"Statistics::newSimulationIteration()", referenced from:
_main in ccZAvFqT.o
"Statistics::Instance()", referenced from:
_main in ccZAvFqT.o
"Statistics::writeAvg()", referenced from:
_main in ccZAvFqT.o
"Statistics::~Statistics()", referenced from:
_main in ccZAvFqT.o
"GraphHelper::Graph::writeGraph(std::vector<IPeer*, std::allocator<IPeer*> >*, std::vector<Connection*, std::allocator<Connection*> >*)", referenced from:
[...] and so on and so on...
当您从命令行编译时,您需要确保在 link 可执行文件时包含所有目标文件 (.o)。
显然,这很难手动控制,这就是为什么人们发明了各种 Makefile 来为他们做这件事。你可以研究这个话题。为了解决您眼前的问题,只需确保您的所有 cpp 文件都列在命令行中以供编译。像
g++ myProject.cpp Statistics.cpp ... <flags> -o <executable>