如果我使用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?

本文关键字:一个 编译 c++11 选项 编译器 什么 问题 功能 文件 如果 链接      更新时间:2023-10-16

我的程序出现了一些奇怪的崩溃。基本上,我有一个最简单的主程序,只有一条语句"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的错误输出要详细得多。

我想知道为什么链接器在这种情况下不抛出任何错误。

相关文章: