2010-10-27 14 views
24

का उपयोग कर 32-बिट बनाम 64-बिट प्रोजेक्ट को संकलित करना मैं कैसे निर्दिष्ट करूं कि लक्ष्य को 32-बिट या 64-बिट के आधार पर अलग-अलग link_directories मान का उपयोग करना चाहिए? उदाहरण के लिए, 32-बिट बाइनरी को 32-बिट बूस्ट से लिंक करने की आवश्यकता है, 64-बिट बाइनरी को 64-बिट बूस्ट से लिंक करने की आवश्यकता है।सीएमके

उत्तर

25

आप इन पंक्तियों

if(CMAKE_SIZEOF_VOID_P EQUAL 8) 
    set(BOOST_LIBRARY "/boost/win64/lib") 
    else(CMAKE_SIZEOF_VOID_P EQUAL 8) 
    set(BOOST_LIBRARY "/boost/win32/lib") 
    endif(CMAKE_SIZEOF_VOID_P EQUAL 8) 
    set(CMAKE_EXE_LINKER_FLAGS ${BOOST_LIBRARY}) 
+0

जैसा कि मार्टिन द्वारा निर्दिष्ट किया गया है, इसे बढ़ावा देने के लिए इसकी आवश्यकता नहीं है, लेकिन वैसे भी यह जानना अच्छा है। – tibur

+6

सेमेक डेवलपर्स सिंटैक्स के हिस्से (...) के साथ क्या सोच रहे थे। बीटीडब्ल्यू अगर यह और नहीं है। मुझे एक पल के लिए भ्रमित कर दिया जब तक मुझे यह याद नहीं आया। नए सेमेक सिंटैक्स को ब्रैकेट में अन्य, एंडिफ सामान की आवश्यकता नहीं है। – Matt

4

बूस्ट के लिए विशेष रूप से साथ कुछ करना है, तो आप

FIND_LIBRARY(Boost 1.44 COMPONENTS ...)

का उपयोग करना चाहिए तब CMake चर Boost_LIBRARY_DIRS सही पुस्तकालय पथ है, जो स्थापित किया जाना है में शामिल होंगे LINK_DIRECTORIES का उपयोग करना, उदाहरण के लिए

LINK_DIRECTORIES(${Boost_LIBRARY_DIRS})

अधिकतर सामान्य मामले को सही ढंग से user434507 के जवाब में वर्णित है।

11

मुझे पता है कि यह काफी पुराना सवाल है। लेकिन जब आप Google "cmake 32 64" के साथ खोज करते हैं तो यह अभी भी शीर्ष पर है। मैं user434507 के जवाब के लिए इसी तरह का जवाब है, लेकिन एक छोटा सा मेरी राय में अधिक पठनीय (मैं cmake में अगर-बाकी निर्माण पसंद नहीं है, यह बदसूरत दिखता है):

math(EXPR BITS "8*${CMAKE_SIZEOF_VOID_P}") 
set(BOOST_LIBRARY "/boost/win${BITS}/lib") 
set(CMAKE_EXE_LINKER_FLAGS ${BOOST_LIBRARY}) 

यह/बढ़ावा के लिए BOOST_LIBRARY पथ इंगित करेगा/जीत/lib या/boost/win/lib, आपके आर्किटेक्चर के आधार पर।

+0

त्रुटि: निर्माण में सीएमके त्रुटि।सेमीकेक: 27 (गणित): गणित अभिव्यक्ति को पार्स नहीं कर सकता: "8 *": वाक्यविन्यास त्रुटि, अप्रत्याशित $ अंत, exp_OPENPARENT या exp_NUMBER (2) –

+0

की अपेक्षा दूसरी पंक्ति में TINY त्रुटि है। {$ BITS} नहीं बल्कि $ {BITS}। ब्रैकेट से पहले $ संकेत। – Nick

0

रोमिनफ के आधार पर मैंने निम्नलिखित समाधान (विंडोज़ के लिए) चालू किया। C: मैं में बढ़ावा पुस्तकालयों स्थापित \ Boost_32 और C: \ Boost_64

CMakeLists.txt में

math(EXPR BITS "8*${CMAKE_SIZEOF_VOID_P}") 
set(BOOST_ROOT C:/Boost_${BITS}) 

find_package(Boost 1.64.0 COMPONENTS ...) 

INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR} ) 
LINK_DIRECTORIES(${Boost_LIBRARY_DIR}) 

स्पष्टीकरण:

  • CMAKE_SIZEOF_VOID_P 32 बिट मंच पर 4 के बराबर है, और 8 64 बिट मंच पर।
  • अभिव्यक्ति 8*${CMAKE_SIZEOF_VOID_P} क्रमशः 32 या 64, का मूल्यांकन करेगा।

    • आप सशर्त, की जरूरत नहीं है (और मेरी CMakeLists में पहले से ही बहुत अधिक कर रहे हैं),
    • यह 90% कैसे:
    • C:/Boost_${BITS}C:/Boost_32 या C:/Boost_64 स्वतः

    लाभ में बदल जाता है आपको सीएमके के साथ बूस्ट शामिल करना चाहिए।