![](/img/trans.png)
[英]g++ why don't you have to link iostream binaries but for pthread you do?
[英]g++ - Why do I have to pass "-pthread" option while using std::thread?
我只是想理解 g++ 使用的概念。 這是我非常簡單的 std::thread 應用程序:
#include <iostream>
#include <thread>
void func() {
std::cout << "Running..." << std::endl;
}
int main()
{
std::thread t(func);
t.join();
return 0;
}
我可以使用以下命令在 macOS/Xcode 9.0 設置上編譯它:
g++ main.cpp -std=c++11
但是我無法在 Linux 上使用相同的命令編譯它,據我所知,我也必須通過-pthread
選項。 否則它會給我以下錯誤:
gcc 版本 7.1.1 20170622(紅帽 7.1.1-3)
main.o: In function `std::thread::thread<void (&)()>(void (&)())':
/usr/include/c++/5/thread:137: undefined reference to `pthread_create'
我認為這是不合邏輯的,我什至不應該知道它正在通過 pthread 實現 std::thread 類。 為什么我必須傳遞-pthread
選項並鏈接到 pthread 庫? C++11 不應該將我從平台特定的細節中抽象出來嗎? 或者我是否有任何其他替代庫,例如 pthread 可以鏈接到我的 std::thread 使用? 還是我應該將其報告為錯誤?
謝謝。
pthread
是操作系統特定線程的行業標准,使用操作系統特定調用。
std::thread
是 C++ 中的抽象,可以使用pthread
或操作系統的本機線程來實現。 但是為了讓它在盡可能多的操作系統上運行得盡可能快, std-library
實現者可以在posix
實現它,因為它們應該適用於所有兼容的操作系統。
也有例外,一些 windows 只有std-library
使用 windows 本機線程代替。
我正在將 pthread 移動到 C++11 中的 std:thread 並且遇到了與您遇到的相同的現象,並且我發現了這篇文章——這可能是正確的答案: https ://developers.redhat.com/articles /2021/12/17/why-glibc-234-removed-libpthread#
一個快速的結論:這取決於 glibc 的版本,2.34 之前版本的 glibc 將需要 -lpthead 標志,即使代碼沒有顯式使用 pthread。
要檢查 glibc 的版本,我們可以使用ldd --version
命令,在我的 ubuntu 20.04 上,它返回如下: ldd (Ubuntu GLIBC 2.31-0ubuntu9.9) 2.31
,所以我仍然必須添加 -lpthread 標志才能使用 std :線。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.