2014-07-17 46 views
4

我有一個問題,CMake can't detect pthread。作爲一種變通我想:如何在使用CMake的鏈接命令行末尾添加一個標誌?

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lpthread") 

然而,這種插入-lpthread在錯誤的地方:

/usr/bin/c++ -std=c++11 -D_GNU_SOURCE -Wall [manyflags ...] -lpthread \ 
    CMakeFiles/connectivity_tool.dir/connectivity_tool/conn_tool.cpp.o  \ 
    -o connectivity_tool -rdynamic -lboost_system [many libraries...] 

這導致:

/usr/bin/ld: /tmp/ccNvRifh.ltrans3.ltrans.o: undefined reference to symbol '[email protected]@GLIBC_2.2.5' 
/lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from command line 

當然,-lpthread應在第三行結束時,不是第一行的結尾。

如何讓CMake在該行的末尾添加-lpthread,或者甚至可以用某種奇怪的方式修改生成的Makefiles以使其發揮作用?

(如果答案涉及到實際檢測並行線程正確,然後回答鏈接的問題。)

+1

在你的set()後面是否還有'include','set(CMAKE_EXE_LINKER_FLAGS ...)'或者package引用?還要注意:對於當前的標準,你應該只指定全局的'-pthread'選項。 –

+0

@πάνταῥεῖ:有,我把它放在最頂端。有趣的是,使用'-pthread'使它工作! – Claudiu

+0

編譯和鏈接階段都需要這個選項('-pthread')。很高興它似乎解決你的問題(恕我直言,鏈接器自動化)。 CMake有時很難以正確的順序得到東西:P。最近,我一直在使用make和[mighty mighty製作模板評估函數](https://www.gnu.org/software/make/manual/html_node/Eval-Function.html)來重新管理我的構建系統。 CMake提供了或多或少的相同內容,但我一直在觸及不可解決的情況(如將CMake生成的庫列表嵌入適當的'--start-group' /'--end-group'對) –

回答

2

「我怎麼能去要麼得到的CMake在這行的末尾添加-lpthread,或者甚至修改生成的Makefiles莫名其妙地以某種黑客的方式得到這個工作?「

1確保您的

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lpthread") 

是最後通過CMake的一致可見。
任何進一步的庫/模塊引用(例如FIND_BOOST)可能會使您想要直接提供的標誌順序搞亂。

我會用

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

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

我覺得這個選項,鏈接器會自動探測合適pthread庫,掛出現在連接結束對象鏈。

相關問題