Linux altında GCC'de std :: thread kullanmak için doğru bağlantı seçenekleri nelerdir?


88

Merhaba std::threadG ++ ile kullanmaya çalışıyorum . İşte test kodum

#include <thread>
#include <iostream>

int main(int, char **){
    std::thread tt([](){ std::cout<<"Thread!"<<std::endl; });
    tt.join();
}

Derliyor, ama çalıştırmaya çalıştığımda sonuç:

terminate called after throwing an instance of 'std::system_error'
  what():  Operation not permitted 
Aborted

Derleyici sürümüm:

$ g++ --version
g++ (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Test kodumun nesi var?

GÜNCELLEME: Kodumu derlemek ve çalıştırmak için aşağıdaki komut satırını kullanıyorum.

$ g++ -std=c++0x test.cpp
$ ./a.out

ve denedim

$ g++ -std=c++0x -lpthread test.cpp
$ ./a.out

hala aynı.


7
@Earth Engine: Bu SO yanıtı, pthread kitaplığı olmadan neden bağlantı hatası olmadığını açıklar: stackoverflow.com/a/6266345/12711 Kısa yanıt: glibcbirçok pthread işlevi için hiçbir şey yapmaz.
Michael Burr

@EarthEngine çözümü bir cevaba koyabilir misiniz? Özellikle kaynak dosyayı takip-lpthread etmelidir .
River

Yanıtlar:


102

Sanırım Linux'ta uygulamak için pthread kullanıldı, std::threadbu yüzden -pthreadderleyici seçeneğini belirtmeniz gerekiyor .

Bu bir bağlantı seçeneği olduğundan, bu derleyici seçeneğinin kaynak dosyalardan SONRA olması gerekir :

$ g++ -std=c++0x test.cpp -pthread

Gcc 4.7.1 kullanarak çok basit bir program derlemeye çalışıyorum ve aynı "işleme izin verilmiyor" hatası alıyorum. Sorun şu ki zaten -pthread bayrağı kullanıyorum. Bildiğiniz başka bayrak var mı?
Filipe

6
Bağlayıcı seçeneklerinden "-statik" işaretini kaldırma sorununu çözdüm, bunun neden olduğunu bilmiyorum
Filipe

Derleyicinin -lpthread seçeneği olmadan derlerken neden hata vermediğini merak ediyorum. Kimse?
zeus2

1
Ubuntu 14.04 g ++ --version altında (g ++ (Ubuntu / Linaro 4.8.1-10ubuntu9) 4.8.1) -W1, --no-as-need g ++ --std = c ++ 11 -Wl, - gerektikçe -pthread main.cc
Begui

1
-Wl,--whole-archive -lpthread -Wl,--no-whole-archivesorunu çözer, değil -pthread. Bu bağlantı sorunu bağlantısına göre, man gcc -pthreadhem önişlemci hem de bağlayıcı için bayrakları ayarlayan çoklu okuma desteği ekleyen g ++ seçenekleri
Denis Zaikin

6

Kullanmanın yanı sıra -std=c++0xve -pthreadsen gerekir değil kullanmak -static.



2

İşte thread kullanan bir C ++ 11 programını derlemek için basit bir CMake dosyası:

CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)
list(APPEND CMAKE_CXX_FLAGS "-pthread -std=c++11 ${CMAKE_CXX_FLAGS}")
add_executable(main main.cpp)

Bunu inşa etmenin bir yolu:

mkdir -p build
cd build
cmake .. && make

2
Benim için çözümünüz hmjd'nin cevabından daha iyi değil ve düzensiz şeyler ekliyor (profil oluşturma, test kapsamı)
Max Beikirch

1

Bu şekilde tek komutla derlemeyi deneyin:

g++ your_prog.cpp -o your_output_binary -lpthread -std=gnu++11

Ayrıca gnu ++ 11 yerine C ++ 11'i de deneyebilirsiniz. Umarım bu işe yarar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.