2013-03-22 9 views
16

के बाहर लाइब्रेरी से स्थिर रूप से लिंक करने के लिए सीएमके का उपयोग करना, मैं अपनी परियोजना को अपनी साझा लाइब्रेरी से जोड़ने के लिए सीएमके का उपयोग करना चाहता हूं। लाइब्रेरी केवल कुछ हद तक परियोजनाओं के बीच साझा की जाती है और यह छोटी है, इसलिए मैं इसे जोड़ने से पहले इसे बनाना चाहूंगा। इसे हर समय बनाना एक अद्यतित प्रीकंपिल्ड संस्करण को बनाए रखने के बजाय एक बेहतर विचार प्रतीत होता है, क्योंकि मैं इसे परियोजना के साथ एक साथ बदलने के लिए दस हूं। यह अलग है, क्योंकि इसमें सामान शामिल है, मुझे लगभग अगले प्रोजेक्ट में निश्चित रूप से आवश्यकता होगी।प्रोजेक्ट

मैं इसे करने के लिए सीएमके को कैसे कॉन्फ़िगर कर सकता हूं?

प्रासंगिक परियोजना के लिए मेरे वर्तमान CMakeLists.txt इस तरह दिखता है:

find_package(Boost REQUIRED COMPONENTS unit_test_framework) 

include_directories(${BaumWelch_SOURCE_DIR}/../../grzesLib/src 
        ${BaumWelch_SOURCE_DIR}/src 
        ${Boost_INCLUDE_DIRS}) 

if(CMAKE_COMPILER_IS_GNUCXX) 
    add_definitions(-g -std=c++11 -Wall -Werror -Wextra -pedantic -Wuninitialized) 
endif() 


# Create the unit tests executable 
add_executable(
baumwelchtests stateindextest.cpp baumiterationtest.cpp baumwelchtest.cpp sampleparameters.cpp sdetest.cpp 
# Key includes for setting up Boost.Test 
testrunner.cpp 
# Just for handy reference 
exampletests.cpp 
) 

# Link the libraries 
target_link_libraries(baumwelchtests ${Boost_LIBRARIES} baumwelchlib grzeslib) 

लेकिन स्पष्ट रूप से संकलन के साथ विफल:

/usr/bin/ld: cannot find -lgrzeslib 
+0

यदि आप libname में .a जोड़ते हैं तो यह काम करता है? – drescherjm

+0

@drescherjm, इस लाइब्रेरी को संभावित रूप से उस बिंदु पर भी संकलित नहीं किया गया है, इसके अलावा मैं कहीं भी निर्दिष्ट नहीं करता जहां बाइनरी होगी, इसलिए मुझे यकीन है कि libname में .a जोड़ने से मदद नहीं मिलेगी। – Grzenio

उत्तर

26

आप पुस्तकालय का निर्माण करना चाहते बजाय था उल्लेख किया एक precompiled संस्करण का उपयोग करें। यदि पुस्तकालय में सीएमकेलिस्ट है, तो आपको add_subdirectory(path/to/the/library/source/directory) का उपयोग करके इसे जोड़ना चाहिए। यह तब आपके प्रोजेक्ट का सबप्रोजेक्ट बन जाएगा और आप अपने सीएमकेलिस्ट में सामान्य रूप से अपने लक्ष्यों के नामों का उपयोग कर सकते हैं।

ध्यान दें कि कमांड को add_ उपनिर्देशिका कहा जाता है, यह डिस्क पर एक मनमाना निर्देशिका हो सकती है; यह मास्टर प्रोजेक्ट के स्रोत डीआईआर की उपनिर्देशिका नहीं है। यदि यह उपनिर्देशिका नहीं है, तो आपको इसके लिए एक बाइनरी निर्देशिका भी स्पष्ट रूप से निर्दिष्ट करना होगा। उदाहरण:

add_subdirectory(/path/to/the/library/source/directory subproject/grzeslib) 

दूसरा तर्क है, अगर एक रिश्तेदार पथ के रूप में दिया, रिश्तेदार CMAKE_CURRENT_BINARY_DIR को स्वीकार किया गया।

+2

मैंने कोशिश की, लेकिन मुझे निम्न त्रुटि मिलती है: 'add_subdirectory को बाइनरी निर्देशिका नहीं दी गई है लेकिन दिए गए स्रोत निर्देशिका"/home/ga1009/phd/cpp/grzesLib/src " "/home/ga1009 की उपनिर्देशिका नहीं है/पीएचडी/सीपीपी/पीएमआई/cpp "। आउट-ऑफ-पेड़ स्रोत निर्दिष्ट करते समय बाइनरी निर्देशिका को स्पष्ट रूप से निर्दिष्ट किया जाना चाहिए। मुझे इस बारे में क्या करना चाहिए? – Grzenio

+0

@Grzenio मैंने जवाब में जानकारी जोड़ दी है। – Angew

+0

मुझे @Grzenio की एक ही त्रुटि मिलती है ... यह मुझे किसी भी मनमानी निर्देशिका को रखने की अनुमति नहीं देती है। –