c++ - 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;
}
解决方案
std::call_once
在 Linux 上的 libstdc++ 中使用pthread_once
. 所以你必须链接 pthread 库来获得它的定义。有关详细信息,请参阅此线程。这就是为什么-pthread
变得有必要。您还可以看到使用nm
or objdump
。
为了能够静态链接 pthread 库,您需要确保所有对象都链接到二进制文件中。有关详细信息,请参阅此线程。相反,您可以包含整个存档:
g++ std_callonce.cpp -g -static -Wl,--whole-archive -lpthread -Wl,--no-whole-archive
那应该可以按您的意愿工作。
但请注意,尽管在极少数情况下静态链接有用,但它通常被认为是有害的。
推荐阅读
- sql-server - 如何在 Visual Studio 2017“查看数据”网格中显示完整的日期时间值?
- arrays - 如何使用 react-native-svg 正确处理折线图上的负值
- ms-access - 使用嵌套查询打开 Recordset
- java - 如何使用 Jackson 将 JSON 数组中的嵌套值解析为列表
- telegram-bot - Telegram-BOT 用户 ID 只是一个私人聊天 ID?
- python - 如何在 python 中修复 datetime TypeError
- android - Android Room:样板代码
- python - Postgresql:使用时间条件插入新记录时更新旧记录
- mysql - 计算二年级复数结果时的问题
- javascript - 使用 Array.Sort 而不使用数组中的两个值