CLion 鏈接庫?如 lpthread 怎麼設置?
寫了個多線程的程序,怎麼添加lpthread?
已解決
這個問題已經解決,但仍然疑點重重。
首先,std=c++11,為什麼還要用 &
而不用 &
其次,我們知道 -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(線程安全)?