首页 > 解决方案 > GCC 7.3.0 链接线程库使用 -static 是否存在错误?

问题描述

我在我的代码中使用 std::call_once ,它编译成功但在运行时崩溃了......就像这个演示:

#include <iostream>
#include <mutex>
using namespace std;

int main()
{
    cout << "Hello world" << endl;
    static once_flag of;
    call_once(of,[]{});
    cout << "see you again" << endl;

    return 0;
}

后来我发现,如果我用 -static 编译,它会崩溃,但只用 -pthread 或 -lpthread 运行成功: 在此处输入图像描述

标签: c++c++11pthreadsstdgcc7

解决方案


std::call_once在 Linux 上的 libstdc++ 中使用pthread_once. 所以你必须链接 pthread 库来获得它的定义。有关详细信息,请参阅此线程。这就是为什么-pthread变得有必要。您还可以看到使用nmor objdump

为了能够静态链接 pthread 库,您需要确保所有对象都链接到二进制文件中。有关详细信息,请参阅此线程。相反,您可以包含整个存档:

g++ std_callonce.cpp -g -static -Wl,--whole-archive -lpthread -Wl,--no-whole-archive

那应该可以按您的意愿工作。

但请注意,尽管在极少数情况下静态链接有用,但它通常被认为是有害的。


推荐阅读