构建二进制文件时需要静态链接所有库。向 cmake 添加一行后,set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++ -static")或add_link_options(-static-libgcc -static-libstdc++ -static)任何创建 std::thread 对象的尝试都会导致Segmentation fault。
操作系统:Ubuntu 20.04、Cmake v 3.19、GCC 9.3。
为了重现这个问题,我写了一个小项目。
Cmake脚本:
cmake_minimum_required(VERSION 3.5)
project(thread_test LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package (Threads)
set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++ -static")
add_executable(thread_test main.cpp)
target_link_libraries(${PROJECT_NAME} ${CMAKE_THREAD_LIBS_INIT})
C++ 代码:
#include <chrono>
#include <iostream>
#include <thread>
using std::cout;
using std::endl;
using std::thread;
using namespace std::chrono_literals;
int main() {
thread th([]() -> void {
std::this_thread::sleep_for(1s);
cout << "Some text." << endl;
});
th.join();
cout << "End" << endl;
return 0;
}
如果您注释掉该行set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++ -static"),那么一切都会开始正常工作。
upd:我尝试手动构建这个 c++ 代码。全部都一样。g++ -static -pthread -std=c++17 -o thread_test main.cpp. 运行Segmentation fault后。那些。g++ 根本无法静态链接线程。做什么的问题仍然悬而未决。
我翻遍了我的资源并找到了它。然后我在SO上找到了它。
问题是您还需要链接 rt 库。在控制台中,结果是这样的
适用于 gcc 和 clang
但我不知道如何在cmake中做到这一点。