2010-09-20 36 views
17

我想在Linux上運行使用CMake構建一個基於OpenCV的項目。到目前爲止,我CMakeLists.txt文件看起來像我如何告訴cmake我希望我的項目靜態鏈接庫?

FIND_PACKAGE (OpenCV REQUIRED) 
... 
TARGET_LINK_LIBRARIES (my-executable ${OpenCV_LIBS}) 

但這會導致動態鏈接庫。我如何鏈接靜態庫?

+0

您如何指出「靜態OpenCV構建CMake」?我的版本有靜態和共享庫。 – 2012-05-17 19:53:53

+0

請參閱下面的答案:http://stackoverflow.com/a/10709424/6069 – agnul 2012-05-22 20:12:03

回答

9

通過在CMake中將BUILD_SHARED_LIBS標誌設置爲false,可以構建靜態OpenCV庫。然後,所有你需要做這些靜態庫來構建自己的應用程序是添加在您的CMakeLists.txt上OpenCV的依賴:

FIND_PACKAGE (OpenCV REQUIRED) 
... 
TARGET_LINK_LIBRARIES (your-application ${OpenCV_LIBS}) 

和CMake的會照顧一切。

+0

它是'BUILD_SHARED_LIBS',而不是'_LIBRARIES'。 :-) – Ela782 2015-12-31 21:36:36

+0

我將BUILD_SHARED_LIBRARIES更正爲BUILD_SHARED_LIBS。 – 2016-09-10 18:28:34

+0

至少在Windows下的CLion(CLion 2016.3 EAP)與CMake 3.6.1捆綁在一起時,在構建OpenCV 3.1.0時,這是在此列出的導致CMake將OpenCV構建爲靜態而非共享庫的唯一方式。請注意,嘗試通過編輯CMakeLists.txt來啓用此選項失敗;只有通過CLion的緩存窗口編輯CMake緩存並點擊* Apply Changes and Reload Project *圖標,我才能讓我的CLion/CMake組合接受'BUILD_SHARED_LIBS'。不確定這是否與CLion有關,應該記錄在案。 – 2016-09-10 20:25:33

8

要鏈接一切靜態,我相信你正在尋找CMAKE_EXE_LINKER_FLAGS(添加-static)。

您是否使用OpenCVConfig.cmake的'簡單方法'?或較舊的FindOpenCV.cmake?

1

在add_library行指定靜態。見http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:add_library

修正,因爲你正在尋找對靜態庫我會考慮的 CMAKE_FIND_LIBRARY_SUFFIXES財產

+0

我認爲add_library命令是要生成一個輸出二進制文件。在這種情況下,指定STATIC將導致它生成.a。 – jkerian 2010-09-20 22:52:39

+0

add_library的static關鍵字指定它生成的庫的類型,它不是在生成二進制文件時使用的。 – RobertJMaynard 2010-09-20 23:11:56

+0

也許我誤解了,但我認爲OP是試圖鏈接一個靜態庫,而不是生成一個。 – jkerian 2010-09-20 23:36:41

2

據我所知,這是一個有點棘手,因爲CMake的,更準確的find_library命令,寧願共享庫,並發現這些鏈接如果共享和靜態都可用。

我仍然在尋找一個很好的解決方案,以便能夠「儘可能靜態地」編譯二進制文件,但是我還沒有找到優雅的解決方案。它肯定會工作的唯一方法是通過自定義的FindXXXX模塊來實現一切。

+1

現在,我唯一的方法是更改​​搜索庫後綴: 'set(CMAKE_FIND_LIBRARY_SUFFIXES $ {CMAKE_STATIC_LIBRARY_SUFFIX})' 'find_library()'之前。 FindBoost有強制使用靜態庫('Boost_USE_STATIC_LIBS')的特殊選項,但它也可以通過更改'CMAKE_FIND_LIBRARY_SUFFIXES'在內部工作。 – marcin 2013-09-03 13:09:16

1

注意GCC拒絕,如果你通過-static選項鍊接,但你必須在鏈接參數動態庫 - 你會如果你只是簡單地使用FindOpenCV.cmake這拿起動態庫(我不知道OpenCVConfig.cmake的行爲如何)...

4

其實這個問題似乎已經在OpenCV附帶的OpenCVConfig.cmake中得到修復。您所要做的就是在您的CMakeLists.txt中定義OpenCV_STATIC。即

set(OpenCV_STATIC ON) 
find_package(OpenCV REQUIRED) 
+0

'find_package(OpenCV REQUIRED)'是做什麼的? – James 2015-07-14 00:40:57

相關問題