स्रोत निर्देशिका में स्थिर लाइब्रेरी में लिंक करने के लिए मैं सीएमके को कैसे बताऊं?


96

मेरे पास मेकफाइल के साथ एक छोटा प्रोजेक्ट है जिसे मैं सीएमके में बदलने की कोशिश कर रहा हूं, ज्यादातर सिर्फ सीएमके के साथ अनुभव प्राप्त करने के लिए। इस उदाहरण के प्रयोजनों के लिए, परियोजना में एक स्रोत फ़ाइल (C ++ शामिल है, हालांकि मुझे नहीं लगता कि भाषा विशेष रूप से प्रासंगिक है) और एक स्थिर पुस्तकालय फ़ाइल है जिसे मैंने कहीं और से कॉपी किया है। तर्क के लिए मान लें कि पुस्तकालय के लिए स्रोत कोड अनुपलब्ध है; मेरे पास केवल .a फ़ाइल और संबंधित हेडर है।

मेरे हस्तनिर्मित मेकफाइल में यह नियम है:

main: main.o libbingitup.a
    g++ -o main main.o libbingitup.a

जो ठीक काम करता है मैं सीएमके को इसे कैसे दोहराऊं? वस्तुतः यह सटीक मेकफाइल नहीं है, निश्चित रूप से, लेकिन ऐसा कुछ जिसमें एक समान लिंकिंग कमांड शामिल है। मैंने स्पष्ट लेकिन भोले तरीकों की कोशिश की है, जैसे

add_executable(main main.cpp libbingitup.a)

या

add_executable(main main.cpp)
target_link_libraries(main libbingitup.a)

साथ ही साथ link_directories(.)या add_library(bingitup STATIC IMPORTED)आदि के साथ विभिन्न चीजें लेकिन अभी तक कुछ भी नहीं है जिसके परिणामस्वरूप एक सफल संबंध है। मुझे क्या करना चाहिए?


संस्करण विवरण: लिनक्स पर सीएमके 2.8.7 (जीसीसी 4.6.3 के साथ कुबंटु 12.04)

जवाबों:


121

CMake पुस्तकालयों को जोड़ने के लिए पूर्ण मार्ग से गुजरने का पक्षधर है, इसलिए मान लेना libbingitup.a में है ${CMAKE_SOURCE_DIR}, निम्नलिखित करने में सफल होना चाहिए:

add_executable(main main.cpp)
target_link_libraries(main ${CMAKE_SOURCE_DIR}/libbingitup.a)

2
महान, यह काम करता है, धन्यवाद! यह स्पष्ट रूप से यहाँ पूरे रास्ते में डाल करने के लिए थोड़ा हैकिश लगता है, लेकिन मुझे लगता है कि यह सिर्फ CMake तरीका है ...
डेविड Z

4
मैं मानता हूं कि यह यहां ओवरकिल की तरह लगता है, लेकिन स्पष्ट रूप से पूर्ण पथ निर्दिष्ट करने पर लाभांश का भुगतान होता है यदि आपके पास एक ही काम के कई अलग-अलग संस्करण स्थापित हैं।
फ्रेजर

1
अद्भुत, हमेशा की तरह! मेरे मामले में, एक अन्य निर्मित गतिशील पुस्तकालय के आधार पर पुस्तकालयों की एक समस्या का समाधान किया गया था जो कि एक स्थैतिक पुस्तकालय पर निर्भर करता था: निर्भर पुस्तकालय भी इस स्थैतिक पुस्तकालय से जुड़ने की कोशिश कर रहे थे।
एंटोनियो

1
मुख्य निर्देशिका को शामिल करने के बारे में कैसे पता चलता है?
मैनुएल श्नाइड 3r

3
आपको उपयोग करने की आवश्यकता होगी target_include_directoriesया include_directories(पहले वाला पसंदीदा तरीका है क्योंकि यह अधिक विशिष्ट है)।
फ्रेजर

31

यदि आप पूर्ण पथ को शामिल नहीं करना चाहते हैं, तो आप कर सकते हैं

add_executable(main main.cpp)
target_link_libraries(main bingitup)

bingitup यदि आप CMake प्रोजेक्ट में स्टैटिक लाइब्रेरी बनाते हैं, तो आप एक ही नाम देंगे।

add_library(bingitup STATIC bingitup.cpp)

सीएमके स्वचालित रूप से लिनक्स पर libसामने और अंत में विंडोज पर .aऔर अंत में जोड़ता है .lib

यदि लाइब्रेरी बाहरी है, तो आप लाइब्रेरी का उपयोग करके पथ जोड़ना चाह सकते हैं

link_directories(/path/to/libraries/)

1
और अगर एक ही नाम वाली .A और .so फाइलें हैं, तो आप कैसे निर्दिष्ट करते हैं कि आप इस मामले में .A या .so के खिलाफ लिंक करना चाहते हैं?
जॉर्ज

1
@ जॉर्ज: आप नहीं कर सकते। यदि आपके पास दोनों प्रकार मौजूद हैं, तो उस फ़ाइल का पूरा नाम शामिल करें जिसे आप लिंक करना चाहते हैं।
संकट लुएंगो

21

मुझे यह मददगार लगा ...

http://www.cmake.org/pipermail/cmake/2011-June/045222.html

उनके उदाहरण से:

ADD_LIBRARY(boost_unit_test_framework STATIC IMPORTED)
SET_TARGET_PROPERTIES(boost_unit_test_framework PROPERTIES IMPORTED_LOCATION /usr/lib/libboost_unit_test_framework.a)
TARGET_LINK_LIBRARIES(mytarget A boost_unit_test_framework C)

3
INCLUDE_DIRECTORIES के बारे में क्या?
kyb

1
यह केवल काम करता है अगर लाइब्रेरी cmake बिल्ड का हिस्सा है, लेकिन विदेशी यह काम नहीं करता है
eigenfield

प्रश्न कहता है "परियोजना में एक स्रोत फ़ाइल (C ++ शामिल है, हालांकि मुझे नहीं लगता कि भाषा विशेष रूप से प्रासंगिक है) और एक स्थिर पुस्तकालय फ़ाइल है जिसे मैंने कहीं और से कॉपी किया है।"
स्टू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.