Segmentation fault при попытке создать поток при статической линковке libstdc++
Возникла необходимость статически слинковать все библиотеки при сборке бинарника. После добавления в 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})
С++ код:
#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: Попробовал собрать этот с++ код руками. Всё тоже самое. g++ -static -pthread -std=c++17 -o thread_test main.cpp. После запуска Segmentation fault. Т.е. у g++ вообще не получается слинковать потоки статически. Вопрос, что делать, остаётся открытым.
Ответы (1 шт):
Порылся у себя по исходникам и нашел. Потом нашел и на SO.
Штука в том, что нужно подлинковать ещё и библиотеку rt. В консоли получается где то так
g++ main.cpp -static -lrt -pthread -Wl,--whole-archive -lpthread -Wl,--no-whole-archive
работает и для gcc, и для clang
Но вот как это сделать в cmake - не знаю.