CLion 鏈接庫?如 lpthread 怎麼設置?

寫了個多線程的程序,怎麼添加lpthread?

已解決


這個問題已經解決,但仍然疑點重重。

首先,std=c++11,為什麼還要用 &

而不用 &?我們不妨假設題主在用 C 語言,那麼正確的做法應該是把 main.cpp 改成 main.c,CMAKE_CXX_FLAGS 改成 CMAKE_C_FLAGS,內容也一併修改。比方說 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11")。

其次,我們知道 -lpthread 只是和 libpthread 鏈接。正確的做法是使用 -pthread,這會設置一些宏。參考gcc - Difference between -pthread and -lpthread while compiling。

然後,直接在 CMAKE_C_FLAGS 里寫命令,這也是能行的。但是,不夠優雅。這樣會導致所有的 target 都鏈接到 libpthread如果要鏈接到一個庫。我們可以用 target_compile_definitions 這個命令為每個目標添加 flags,比如 target_compile_definitions(thread PUBLIC "-pthread")。但是這樣足夠優雅嗎?明明可以更語義化的——target_link_libraries(thread pthread)。

當然,我們發現,這只是 -lpthread 而不是 -pthead。好在前人為我們寫好了包。可以用 find_package(Threads REQUIRED) 來找尋線程庫(可能是 win32 線程,也可能是 posix 線程)。如果我們 set(CMAKE_THREAD_PREFER_PTHREAD) 的話,就會添加 "-pthead" 而不是 "-lpthread"。然後我們就可以 target_link_libraries(thread ${CMAKE_THREAD_LIBS_INIT}) 來使它對這個 target 生效。

希望這篇回答能介紹一些 CMake 的知識。


set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthread")


在std=c++11後面加一個 -lpthread 例如:

cmake_minimum_required(VERSION 3.3)

project(thread)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -lpthread")

set(SOURCE_FILES main.cpp)

add_executable(thread ${SOURCE_FILES})


推薦閱讀:

剛學c++多線程,需要從哪些方面入手,有推薦的教程或書籍嗎?
多線程引用計數如何釋放?
C++中如何將函數調用轉發至另一個線程?
互斥鎖,同步鎖,臨界區,互斥量,信號量,自旋鎖之間聯繫是什麼?
C# 如何在調用控制項時做到 Thread-safe(線程安全)?

TAG:軟體開發 | 程序 | 多線程 | CMake | CLion |