2010-09-20 15 views
17

मैं लिनक्स पर चल रहे सीएमके का उपयोग करके ओपनसीवी-आधारित परियोजना बनाने की कोशिश कर रहा हूं। अब तक मेरी CMakeLists.txt फ़ाइलोंमैं cmake कैसे कहूं मैं अपनी परियोजना को पुस्तकालयों को स्थिर रूप से लिंक करना चाहता हूं?

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

तरह दिखता है, लेकिन यह गतिशील रूप से जुड़ा हुआ पुस्तकालयों का परिणाम है। मैं स्थिर पुस्तकालयों से कैसे जुड़ूं?

+0

आप "स्थिर ओपनसीवी बिल्ड पर सीएमके" कैसे इंगित करते हैं? मेरे निर्माण में स्थैतिक और साझा libs दोनों हैं। –

+0

नीचे उत्तर देखें: http://stackoverflow.com/a/10709424/6069 – agnul

उत्तर

9

आप BUILD_SHARED_LIBS ध्वज को सीएमके में झूठ बोलकर स्थिर ओपनसीवी पुस्तकालयों का निर्माण करते हैं। तो फिर तुम सब उन स्थिर पुस्तकालयों के साथ अपने स्वयं के आवेदन के निर्माण के लिए क्या करने की जरूरत अपने CMakeLists.txt में OpenCV पर निर्भरता को जोड़ने के लिए है:

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

और CMake सब कुछ का ख्याल रखना होगा।

+0

यह 'BUILD_SHARED_LIBS' है,' _LIBRARIES' नहीं। :-) – Ela782

+0

मैंने BUILD_SHARED_LIBRARIES को BUILD_SHARED_LIBS में सही किया। –

+0

कम से कम विंडोज़ (सीएलओएन 2016.3 ईएपी) के तहत सीएलओएन के साथ सीएमएक्स 3.6.1 के साथ बंडल किया जाता है, जब ओपनसीवी 3.1.0 का निर्माण होता है, तो यहां सूचीबद्ध लोगों का यह एकमात्र तरीका था जिससे सीएमके ने ओपनसीवी को साझा पुस्तकालयों के बजाय स्थिर के रूप में बनाया। ध्यान दें कि CMakeLists.txt संपादित करके इस विकल्प को सक्षम करने का प्रयास विफल रहा; केवल सीएलओएन कैश विंडो के माध्यम से सीएमके कैश को संपादित करके और * लागू करें और रीलोड प्रोजेक्ट * आइकन पर क्लिक करके मैं आइकन 'BUILD_SHARED_LIBS' स्वीकार करने के लिए अपना CLion/CMake संयोजन प्राप्त करने में सक्षम था। सुनिश्चित नहीं है कि यह CLion के साथ एक समस्या है जिसे दस्तावेज किया जाना चाहिए। –

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 कमांड आउटपुट बाइनरी उत्पन्न करना है। इस मामले में, स्टेटिक निर्दिष्ट करने से यह उत्पन्न होता है। ए। – jkerian

+0

add_library के लिए स्थिर कीवर्ड यह निर्दिष्ट करता है कि यह किस प्रकार की लाइब्रेरी उत्पन्न करता है, यह बाइनरी उत्पन्न करने के लिए नहीं है। – RobertJMaynard

+0

शायद मुझे गलत समझा, लेकिन मैंने सोचा कि ओपी एक स्थिर पुस्तकालय से जुड़ने की कोशिश कर रहा था, एक उत्पन्न नहीं करता था। – jkerian

2

AFAIK कि थोड़ा मुश्किल है, क्योंकि CMake, और अधिक स्पष्ट find_library आदेश, libs साझा और उन पाता पसंद के खिलाफ लिंक करने के लिए देख रहे हैं यदि दोनों साझा और स्थैतिक उपलब्ध हैं।

मैं अभी भी एक अच्छा समाधान अपने आप को "संभव के रूप में स्थिर के रूप में" बाइनरी संकलित करने के लिए सक्षम होने के लिए की तलाश में हूँ, लेकिन मैं अभी तक कोई सुरुचिपूर्ण समाधान मिल गया है। एकमात्र तरीका यह निश्चित रूप से काम करेगा कस्टम FindXXXX मॉड्यूल के माध्यम से सब कुछ लागू करना है।

+1

खोजा गया लाइब्रेरी प्रत्यय को बदलने का एकमात्र तरीका: 'सेट (CMAKE_FIND_LIBRARY_SUFFIXES $ {CMAKE_STATIC_LIBRARY_SUFFIX})' 'find_library()' से पहले। FindBoost और स्थिर पुस्तकालयों ('Boost_USE_STATIC_LIBS') के उपयोग के लिए मजबूर करने की विशेष विकल्प है, लेकिन यह भी बदल रहा है' CMAKE_FIND_LIBRARY_SUFFIXES' द्वारा आंतरिक रूप से काम करता है। – marcin

1

जीसीसी लिंक करने के लिए अगर आप स्थैतिक विकल्प पारित मना कर दिया ध्यान दें कि, लेकिन आप लिंक बहस में गतिशील libs है - जो आप अगर आप बस FindOpenCV.cmake का उपयोग करेगा और इस गतिशील libs को चुनता है (मैं पता नहीं कैसे OpenCVConfig.cmake व्यवहार करता है) ...

4

वास्तव में इस मुद्दे को पहले से ही OpenCVConfig.cmake कि OpenCV के साथ आता है में निर्धारित किया गया है लगता है। आपको बस अपने CMakeLists.txt में OpenCV_STATIC परिभाषित करना है। अर्थात।

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

'find_package (OpenCV आवश्यक) क्या करता है? – James

संबंधित मुद्दे

 संबंधित मुद्दे