我想在Linux上運行使用CMake構建一個基於OpenCV的項目。到目前爲止,我CMakeLists.txt
文件看起來像我如何告訴cmake我希望我的項目靜態鏈接庫?
FIND_PACKAGE (OpenCV REQUIRED)
...
TARGET_LINK_LIBRARIES (my-executable ${OpenCV_LIBS})
但這會導致動態鏈接庫。我如何鏈接靜態庫?
我想在Linux上運行使用CMake構建一個基於OpenCV的項目。到目前爲止,我CMakeLists.txt
文件看起來像我如何告訴cmake我希望我的項目靜態鏈接庫?
FIND_PACKAGE (OpenCV REQUIRED)
...
TARGET_LINK_LIBRARIES (my-executable ${OpenCV_LIBS})
但這會導致動態鏈接庫。我如何鏈接靜態庫?
通過在CMake中將BUILD_SHARED_LIBS
標誌設置爲false,可以構建靜態OpenCV庫。然後,所有你需要做這些靜態庫來構建自己的應用程序是添加在您的CMakeLists.txt
上OpenCV的依賴:
FIND_PACKAGE (OpenCV REQUIRED)
...
TARGET_LINK_LIBRARIES (your-application ${OpenCV_LIBS})
和CMake的會照顧一切。
它是'BUILD_SHARED_LIBS',而不是'_LIBRARIES'。 :-) – Ela782 2015-12-31 21:36:36
我將BUILD_SHARED_LIBRARIES更正爲BUILD_SHARED_LIBS。 – 2016-09-10 18:28:34
至少在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
要鏈接一切靜態,我相信你正在尋找CMAKE_EXE_LINKER_FLAGS
(添加-static
)。
您是否使用OpenCVConfig.cmake的'簡單方法'?或較舊的FindOpenCV.cmake?
在add_library行指定靜態。見http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:add_library
修正,因爲你正在尋找對靜態庫我會考慮的 CMAKE_FIND_LIBRARY_SUFFIXES財產
我認爲add_library命令是要生成一個輸出二進制文件。在這種情況下,指定STATIC將導致它生成.a。 – jkerian 2010-09-20 22:52:39
add_library的static關鍵字指定它生成的庫的類型,它不是在生成二進制文件時使用的。 – RobertJMaynard 2010-09-20 23:11:56
也許我誤解了,但我認爲OP是試圖鏈接一個靜態庫,而不是生成一個。 – jkerian 2010-09-20 23:36:41
據我所知,這是一個有點棘手,因爲CMake的,更準確的find_library命令,寧願共享庫,並發現這些鏈接如果共享和靜態都可用。
我仍然在尋找一個很好的解決方案,以便能夠「儘可能靜態地」編譯二進制文件,但是我還沒有找到優雅的解決方案。它肯定會工作的唯一方法是通過自定義的FindXXXX模塊來實現一切。
現在,我唯一的方法是更改搜索庫後綴: '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
注意GCC拒絕,如果你通過-static選項鍊接,但你必須在鏈接參數動態庫 - 你會如果你只是簡單地使用FindOpenCV.cmake這拿起動態庫(我不知道OpenCVConfig.cmake的行爲如何)...
其實這個問題似乎已經在OpenCV附帶的OpenCVConfig.cmake
中得到修復。您所要做的就是在您的CMakeLists.txt
中定義OpenCV_STATIC
。即
set(OpenCV_STATIC ON)
find_package(OpenCV REQUIRED)
'find_package(OpenCV REQUIRED)'是做什麼的? – James 2015-07-14 00:40:57
您如何指出「靜態OpenCV構建CMake」?我的版本有靜態和共享庫。 – 2012-05-17 19:53:53
請參閱下面的答案:http://stackoverflow.com/a/10709424/6069 – agnul 2012-05-22 20:12:03