2012-08-22 10 views
34

मैं वर्तमान में अपने प्रोजेक्ट (विंडोज़ पर) के लिए सीएमके चलाने की कोशिश कर रहा हूं। मैं एक कस्टम स्थान का उपयोग करना चाहता हूं जहां सभी पुस्तकालय स्थापित हैं। उस पथ मैं ऐसा करने की कोशिश की के बारे में सूचित करने के लिए CMake:सेमीकेक - find_library - कस्टम लाइब्रेरी स्थान

set(CMAKE_PREFIX_PATH D:/develop/cmake/libs) 

लेकिन जब मैं

find_library(CURL_LIBRARY NAMES curl curllib libcurl_imp curllib_static) 

साथ पुस्तकालय खोजने की कोशिश CMake यह नहीं मिल रहा। जब मैं

set(CMAKE_PREFIX_PATH D:/develop/cmake/libs/curl) 

करने के लिए अपने उपसर्ग पथ सेट ... पुस्तकालय स्थित है।

तो मेरे सवाल है: मैं कैसे कॉन्फ़िगर कर सकते हैं CMake ठीक से एक कस्टम स्थान जो कि तरह लग रहा है पर एक निर्देशिका structore के साथ काम करने के लिए:

D:/develop/cmake/libs/ 
-> libA 
    -> include 
    -> lib 
-> libB 
    -> include 
    -> lib 
-> ... 
    -> include 
    -> lib 

"शामिल हैं" में सार्वजनिक हेडर झूठ और "lib में "संकलित पुस्तकालय हैं।

आशा कोई मेरी मदद कर सकते - अग्रिम धन्यवाद

संपादित करें: मेरे लिए वर्तमान समाधान नहीं है, यह करने के लिए इससे पहले कि मैं पुस्तकालयों के लिए खोज:

set(CUSTOM_LIBRARY_PATH D:/develop/cmake/libs) 
file(GLOB sub-dir ${CUSTOM_LIBRARY_PATH}/*) 
foreach(dir ${sub-dir}) 
    if(IS_DIRECTORY ${dir}) 
     set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH};${dir}) 
    endif() 
endforeach() 

लेकिन उस तरह के लिए डिफ़ॉल्ट मॉड्यूल बूस्ट इसे तब तक नहीं ढूंढ पाएगा क्योंकि बूस्ट की निर्देशिका संरचना कुछ अलग है।

boost -> include -> boost-1_50 -> *.hpp 

जब मैं सामग्री को "बढ़ावा देने-1_50" "शामिल हैं" करने के लिए पुस्तकालय पाया जा सकता है लेकिन यह है कि जिस तरह से यह एक से अधिक संस्करण सही संभाल पाना संभव नहीं है?

+1

सबसे पहले, तुम क्यों CMakeLists.txt अंदर CMAKE_PREFIX_PATH सेट कर रहे हैं: आप के लिए

<prefix>/ (W) <prefix>/(cmake|CMake)/ (W) <prefix>/<name>*/ (W) <prefix>/<name>*/(cmake|CMake)/ (W) <prefix>/(lib/<arch>|lib|share)/cmake/<name>*/ (U) <prefix>/(lib/<arch>|lib|share)/<name>*/ (U) <prefix>/(lib/<arch>|lib|share)/<name>*/(cmake|CMake)/ (U) 

अपने मामले आप अलग अलग पथों CMAKE_PREFIX_PATH को जोड़ने की जरूरत है में देख रहे हैं? यदि कोई अन्य व्यक्ति आपकी परियोजना को संकलित करने का प्रयास करेगा तो यह काम नहीं करेगा। – arrowd

+0

यह केवल परीक्षण के लिए था - अगर यह काम करेगा तो मैं पर्यावरण परिवर्तनीय – Daniel

उत्तर

9

मैंने देखा कि दो लोग अपने पसंदीदा में उस सवाल डाल तो मैं समाधान जो मेरे लिए काम करता जवाब देने की कोशिश करेंगे: इसके बजाय मॉड्यूल मैं सभी पुस्तकालयों जो स्थापित कर रहे हैं के लिए विन्यास फाइल लिख रहा हूँ का उपयोग करने का। वे फ़ाइलें बेहद सरल हैं और इन्हें गैर-मानक चर सेट करने के लिए भी उपयोग किया जा सकता है। CMake (कम से कम खिड़कियों पर)

CMAKE_PREFIX_PATH/<<package_name>>-<<version>>/<<package_name>>-config.cmake 

(जो एक वातावरण चर के माध्यम से स्थापित किया जा सकता) में उन लोगों के विन्यास फाइल के लिए खोज करेंगे। इसलिए उदाहरण के लिए बढ़ावा विन्यास पथ

CMAKE_PREFIX_PATH/boost-1_50/boost-config.cmake 

कि विन्यास आप चर सेट कर सकते हैं में है। सुंदर सीधे आगे

set(boost_INCLUDE_DIRS ${boost_DIR}/include) 
set(boost_LIBRARY_DIR ${boost_DIR}/lib) 
foreach(component ${boost_FIND_COMPONENTS}) 
    set(boost_LIBRARIES ${boost_LIBRARIES} debug ${boost_LIBRARY_DIR}/libboost_${component}-vc110-mt-gd-1_50.lib) 
    set(boost_LIBRARIES ${boost_LIBRARIES} optimized ${boost_LIBRARY_DIR}/libboost_${component}-vc110-mt-1_50.lib) 
endforeach() 
add_definitions(-D_WIN32_WINNT=0x0501) 

+ यह छोटा करने के लिए फ़ाइलों और भी अधिक जब आप कुछ सहायक कार्यों लिखने config के आकार संभव है: को बढ़ावा देने के लिए मेरे कॉन्फ़िग फ़ाइल कि तरह दिखता है। इस सेटअप के साथ मेरे पास एकमात्र मुद्दा यह है कि मुझे कॉन्फ़िगरेशन फ़ाइलों को मॉड्यूल खोजने पर प्राथमिकता देने का कोई तरीका नहीं मिला है - इसलिए आपको खोज मॉड्यूल को हटाने की आवश्यकता है।

आशा है कि यह अन्य लोगों के लिए उपयोगी होगा।

15

सबसे आसान समाधान प्रत्येक find_* अनुरोध में HINTS जोड़ने का सबसे आसान समाधान हो सकता है।

उदाहरण के लिए:

find_library(CURL_LIBRARY 
    NAMES curl curllib libcurl_imp curllib_static 
    HINTS "${CMAKE_PREFIX_PATH}/curl/lib" 
) 

बूस्ट मैं दृढ़ता से FindBoost मानक मॉड्यूल का उपयोग कर और अपने बूस्ट पुस्तकालयों के लिए बात करने के लिए BOOST_DIR चर स्थापित करने की सिफारिश करेंगे के लिए।

+0

का उपयोग करूंगा। मैं संकेतों का संयोजन करता हूं + पर्यावरण चर जैसे BOOST_DIR को सेमीकैक को विंडोज़ पर अपने पुस्तकालयों को ढूंढने में मदद करने के लिए। कुछ पुस्तकालयों के लिए यदि मानक मॉड्यूल पर्यावरण चर को नहीं देखता है तो मैं अपने सीएमके लिस्ट.txt में जांच करूंगा यदि पर्यावरण चर सेट किया गया है लेकिन सीएमके वैरिएबल खाली है और फिर सीएमके वैरिएबल को सेट करने की अपेक्षा करता है। – drescherjm

+0

एचआईएनटीएस कीवर्ड ने कार्य किया। मेरे मामले में मैं एक स्थानीय फ़ोल्डर से गणित पुस्तकालय libm.so का उपयोग कर रहा हूँ। लेकिन हर बार जब मैं संकलित, यह इसे सिस्टम फ़ोल्डर से लिया। HINTS कीवर्ड का उपयोग करके और मेरे libm.so के पथ को बताकर, मैं सफलतापूर्वक अपने libm.so के खिलाफ लिंक कर सकता हूं। – infoclogged

+0

और जब मैं इस निर्माण का उपयोग करता हूं, जेनरेट एमएसवीसी प्रोजेक्ट में मुझे त्रुटि मिलती है "CURL_LIBRARY.lib नहीं मिला"। मैं घायल हूं कि यह वैरिएबल नाम से लाइब्रेरी को खोजने का प्रयास क्यों करता है, लेकिन ऐसा करता है। – Arkady

6

अपने इच्छित तरीके से स्वचालित रूप से CMAKE_PREFIX_PATH सेट करने का कोई तरीका नहीं है। मैं इस समस्या को हल करने के निम्नलिखित तरीकों को देखता हूं:

  1. सभी पुस्तकालयों को एक ही डीआईआर में रखें। यही है, include/ में सभी libs, lib/ - द्विआधारी, आदि के लिए शीर्षलेख होंगे। एफवाईआई, यह अधिकांश यूनिक्स-जैसी प्रणालियों के लिए सामान्य लेआउट है।

  2. वैश्विक पर्यावरण चर सेट CMAKE_PREFIX_PATHD:/develop/cmake/libs/libA;D:/develop/cmake/libs/libB;... पर सेट करें। जब आप सीएमके चलाते हैं, तो यह स्वचालित रूप से इस env var को उठाएगा और अपने स्वयं के CMAKE_PREFIX_PATH को पॉप्युलेट करेगा।

  3. एक रैपर .bat स्क्रिप्ट लिखें, जो कमांड -D CMAKE_PREFIX_PATH=... तर्क के साथ कॉल करेगा।

0

मुझे एक समान परिदृश्य का सामना करना पड़ा है। मैं इस निम्नलिखित कोड में जोड़कर इसे हल सिर्फ find_library() से पहले:

set(CMAKE_PREFIX_PATH /the/custom/path/to/your/lib/) 

तो यह पुस्तकालय स्थान पा सकते हैं।

+2

'CMAKE_PREFIX_PATH' उपयोगकर्ता द्वारा निर्धारित किया जाना है (या जो भी 'cmake' कहता है)। हार्डकोडिंग यह आपके लिए काम कर सकती है, लेकिन अन्य प्रणालियों पर नहीं। – usr1234567

3

आपके पास घोंसले का एक अतिरिक्त स्तर है। सीएमएकेई पुस्तकालयों के लिए शीर्षलेखों के लिए $CMAKE_PREFIX_PATH/include और $CMAKE_PREFIX_PATH/libs के अंतर्गत खोज करेगा।

CMake documentation से:

CMAKE_PREFIX_PATH सूची में प्रत्येक पथ के लिए, CMake "पथ/शामिल हैं" और "PATH" जब FIND_PATH() कहा जाता है, "path/बिन" और की जाँच करेगा " पथ "जब FIND_PROGRAM() कहा जाता है, और" पथ/lib और "PATH" जब FIND_LIBRARY() कहा जाता है।

3

उपयोग CMAKE_PREFIX_PATH अनेक पथों जोड़कर (अर्धविराम और कोई सफेद रिक्त स्थान से विभाजित)। आप कर सकते हैं एट यह एक पर्यावरण चर अपने cmake विन्यास फाइल में पूर्ण पथ होने

सूचना जो cmake following folders जहां है में से किसी में कॉन्फ़िग फ़ाइल के लिए दिखेगा CMAKE_PREFIX_PATH और नाम पर पथ के किसी भी पुस्तकालय का नाम है से बचने के लिए के रूप में

D:/develop/cmake/libs/libA;D:/develop/cmake/libB