2012-12-29 24 views
40

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

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

जो ठीक काम करता है:

मेरे हाथ से बने Makefile इस बिल्ड नियम शामिल हैं। मैं इसे पुन: पेश करने के लिए सीएमके को कैसे बताऊं? सचमुच यह सटीक मेकफ़ाइल नहीं है, लेकिन कुछ ऐसा है जिसमें समकक्ष लिंकिंग कमांड शामिल है। मैं एक सफल संबंध में साथ link_directories(.) या add_library(bingitup STATIC IMPORTED) आदि लेकिन अभी तक कुछ भी है कि परिणाम स्पष्ट लेकिन अनुभवहीन तरीके की कोशिश की है,

add_executable(main main.cpp libbingitup.a) 

या

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

साथ ही विभिन्न चीजों की तरह। मुझे क्या करना चाहिए?


संस्करण विवरण: लिनक्स पर CMake 2.8.7 (Kubuntu 12.04) जीसीसी 4.6.3

उत्तर

60

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

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

बढ़िया है, कि काम करता है का उपयोग करते हुए धन्यवाद पुस्तकालय के लिए पथ को जोड़ने के लिए चाहते हो सकता है! यह स्पष्ट रूप से यहां पूर्ण पथ में डालने के लिए थोड़ा हैकिश लगता है, लेकिन मुझे लगता है कि यह केवल सीएमके रास्ता है ... –

+2

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

+0

आश्चर्यजनक, सामान्य रूप से! मेरे मामले में, एक और निर्मित गतिशील पुस्तकालय के आधार पर पुस्तकालयों की एक समस्या हल हुई जो स्थिर पुस्तकालय के आधार पर थी: निर्भर पुस्तकालय भी इस स्थिर पुस्तकालय से जुड़ने की कोशिश कर रहे थे। – Antonio

10

मैं यह सहायक ...

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) 
+0

सही काम करता है। धन्यवाद –

7

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

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

bingitup एक ही नाम है यदि आप बनाना आप एक लक्ष्य देना चाहते हैं एक CMake परियोजना में स्थिर पुस्तकालय:

add_library(bingitup STATIC bingitup.cpp) 

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

तो पुस्तकालय बाहरी है, तो आप,

link_directories(/path/to/libraries/) 
संबंधित मुद्दे