如果我使用c++11功能编译一个文件,同时将其链接到一个没有c++11编译器选项编译的库,会有什么问题吗
Is there any issue if I use c++11 feature to compile a file while linking it against a library which was compiled without c++11 compiler option?
我的程序出现了一些奇怪的崩溃。基本上,我有一个最简单的主程序,只有一条语句"return 0"。该程序在清除静态concurrent_unordered_set(来自英特尔的线程构建块库)时崩溃。如果我注释掉两行代码,它不会崩溃。我将该程序链接到一个没有-std=c++0x标志的库,但我使用该标志编译它。
请注意,除了静态对象的构造函数之外,没有调用任何函数。
可能是什么问题?我真是一头雾水。
是的,但这在很大程度上取决于编译器版本以及具体的操作方式和内容。
如果可以的话,只需使用相同的选项编译所有内容即可。
如果没有,一定要阅读,例如这个和这个,并彻底测试。
我想我已经弄清楚了问题发生的原因。我正在运行一个测试,该测试是用于创建共享库的代码的一部分。主要功能是通过定义宏来"启用"。我无法粘贴原始代码,但下面的代码示例将解释其行为。请检查样品中是否有"释放两次"。(不过这与-std=c++0x标志无关)
以下是.hpp 的代码
#ifndef __A_HPP__
#define __A_HPP__
#include <vector>
using std::vector;
void fun();
class A
{
public:
A() : x(0) { fun(); }
A(const A& a) { x = a.x;}
void afun();
private:
static vector<int> _somevals;// THIS WILL GET RELEASED TWICE
int x ;
};
#endif
以下是a.cpp 的代码
#include "a.hpp"
vector<int> A::_somevals; // THIS GETS RELEASED TWICE
void A::afun()
{
_somevals.push_back(1);
}
#ifdef __STANDALONE_TEST__
int main()
{
A a;
a.afun();
fun();
return 0;
}
#endif
以下是b.cpp 的代码
void fun()
{
}
现在,我创建了共享库:
$ g++ -c -Wall -Werror -fpic a.cpp -std=c++0x -I .
$ g++ -c -Wall -Werror -fpic b.cpp -std=c++0x
$ g++ -shared -fpic -o libtesta.so a.o b.o
然后创建a.out进行测试。
$ g++ -D__STANDALONE_TEST__ a.cpp -std=c++0x -ltesta -L.
$ export LD_LIBRARY_PATH=.
$./a.out
现在,运行a.out会出现错误。vector_somevals被释放了两次,因此它抛出了两次免费错误。我用g++4.6.1和4.8.2进行了测试,在这两种情况下它都崩溃了。但是g++4.6.1的错误输出要详细得多。
我想知道为什么链接器在这种情况下不抛出任何错误。