首先,我知道这里有几个多重定义错误问题,但我对此感到困惑。
我有一个正在开发的模块,我一直在调试中构建它,即 -DDEBUG -g -O0
。现在我想发布 -DNDEBUG -Os
我构建了多个 STL 定义的多个定义,包括
- std::basic_ios >::basic_ios()
- std::__throw_bad_alloc()
- std::string::assign(char const*)v
- 等等
我检查了我的项目,所有头文件都有#ifndef 保护,并且头文件中唯一的代码是内联声明的。
在四处乱逛时,我发现我可以使用 -DNDEBUG -O0
进行编译,但不能进行任何级别的优化。构建过程涉及构建大约 2 打对象,然后将它们链接在一起。为什么优化会杀死链接器?我该如何解决这个问题?
使用 TDM MinGW 4.6.1 构建。
最佳答案
在 Release模式下包含 MFC 调试文件时也会出现此问题,反之亦然。 这里可能是同一个问题 - 这只是一个大胆的猜测。
要解决我猜测的原因,请执行以下操作:
#ifdef _DEBUG
#define DEBUG_WAS_DEFINED
//include files that give you multiple definitions here
#endif
//.....
//.....
//rest of code/includes
#ifdef DEBUG_WAS_DEFINED
#undef DEBUG_WAS_DEFINED
#define _DEBUG //revert to previous state
#endif
您可能想看看这个链接:http://www.flounder.com/debug_release.htm ,关于混合 DLL 的部分。
关于来自优化级别的 C++ 多重定义链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8993590/