2011-04-27 14 views
36

का उपयोग कर 32-बिट संकलन को मजबूर करने का उचित तरीका क्षमा करें कि कई समान प्रश्न हैं, लेकिन मुझे लगता है कि सीएमकेक प्रश्नों के लिए गुगलिंग हमेशा समान-समान-समान परिदृश्य उत्पन्न नहीं करती है, विवादित सीएमके आदेश और इतनी पर!सीएमके

मुझे 32-बिट बाइनरी बनाने के लिए अपनी परियोजना को मजबूर करने की आवश्यकता है क्योंकि मुझे पुस्तकालय से लिंक करना है जो केवल 32-बिट के रूप में उपलब्ध है।

/usr/bin/ld: i386 architecture of input file `*external-32bit-lib*' is incompatible with i386:x86-64 output 

मैं क्या इकट्ठा से, इसलिए मैं का उपयोग करना चाहिए:: मैं इस तरह के रूप त्रुटि संदेश के आधार पर इस का निदान

set (CMAKE_CXX_FLAGS "-m32") 

यह चीजों को बदलना है - अब मैं जैसे कई त्रुटियाँ मिलती है:

/usr/bin/ld: i386 architecture of input file `*project-output-lib*' is incompatible with i386:x86-64 output 

और अभी भी बाहरी पुस्तकालय के लिए भी वही त्रुटियां मिलती हैं। मैं सोचता हूं ऐसा इसलिए है क्योंकि -m32 ने जीसीसी को 32-बिट बाइनरी उत्पन्न की है, लेकिन एलडी अभी भी 64-बिट आउटपुट के लिए प्रयास कर रहा है? इस समस्या के लिए आगे बढ़ने से कोई सफलता नहीं मिली, इसलिए अगर कोई यह सत्यापित कर सके कि मैं सही हूं और ऐसा करने का सही तरीका देता हूं, तो मैं बहुत आभारी रहूंगा!

बहुत धन्यवाद!

उत्तर

4

ऐसा लगता है कि आपने एम 32 को एलएफएलजीएस भी पास नहीं किया है, या पुरानी ओबीजे फाइलें स्कुलिंग कर रही हैं। पहले साफ करना सुनिश्चित करें।

यह सवाल तुम्हारा के समान है: cmake, gcc, cuda and -m32

+0

धन्यवाद क्योकि अच्छी तरह से मामला हो सकता है - लेकिन कैसे होगा हालांकि मैं सीएमके करता हूं? और क्या यह करने के लिए यह सबसे समझदार या 'उचित' तरीका है? मैंने साफ बीटीडब्ल्यू किया :) – jazzbassrob

+0

अद्यतन उत्तर। लिंक देखें। मेरा मतलब है कि अपने हाथ साफ करें, आप गंदे हैं :) –

+0

चीयर्स, लेकिन दुर्भाग्य से लिंक मदद नहीं करता है। एलडीएफएलजीएस को सेट करने का कोई असर नहीं पड़ता है ... – jazzbassrob

5

CMAKE_CXX_FLAGS केवल सी ++ संकलक प्रभावित करता है। निम्नलिखित स्रोत से

set (CMAKE_C_FLAGS "-m32") 
3

उपयोग TRY_RUN आदेश: आप शायद भी सी संकलक के लिए ध्वज सेट करने के लिए है।

size.cpp:

#include <cstdlib> 

int main(int argc, char** argv) 
{ 
    size_t size = sizeof(void*); 
    if (size == 4) 
    return 0; 
    return 1; 
} 

CMakeLists.txt:

TRY_RUN(RUN_RESULT_VAR COMPILE_RESULT_VAR ${your_temp_dir} size.cpp RUN_OUTPUT_VARIABLE IS_64_SYSTEM) 
IF(IS_64_SYSTEM) 
    MESSAGE(FATAL_ERROR "64 compiling not allowed!") 
ENDIF(IS_64_SYSTEM) 

यह सब मानक संकलक पर काम करेंगे।

33

आप पुस्तकालयों और बाइनरी बनाने के लिए cmake इस प्रयोग का उपयोग कर 32 बिट के लिए लिंक और संकलित करने के लिए करना चाहते हैं:

बनाना पुस्तकालयों:

add_library(mylib SHARED my_source.c) 
set_target_properties(mylib PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32") 

बनाने निष्पादनयोग्य:

add_executable(mybin sources.c) 
set_target_properties(mybin PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32") 

आशा इस मदद करता है,

13

भले ही यह अतिरिक्त कार्यों की तरह लगता है, मुझे लगता है कि एक उचित soluti इस मामले में टूलचैन फ़ाइल का उपयोग करना है।कुछ की तरह:

# the name of the target operating system 
set(CMAKE_SYSTEM_NAME Linux) 

# which compilers to use for C and C++ 
set(CMAKE_C_COMPILER gcc) 
set(CMAKE_C_FLAGS -m32) 
set(CMAKE_CXX_COMPILER g++) 
set(CMAKE_CXX_FLAGS -m32) 

# here is the target environment located 
set(CMAKE_FIND_ROOT_PATH /usr/i486-linux-gnu) 

# adjust the default behaviour of the FIND_XXX() commands: 
# search headers and libraries in the target environment, search 
# programs in the host environment 
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) 
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) 
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) 

तब उपयोग बस है:

$ cmake -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake /path/to/source 

महत्वपूर्ण बात यह है कि यहां एक अब एक रूट निर्देशिका पथ (CMAKE_FIND_ROOT_PATH) जो तीसरे पक्ष के लिए खोज करने के लिए इस्तेमाल किया जाना चाहिए निर्दिष्ट करने के लिए सक्षम है lib। वास्तव में आपका कंपाइलर यह समझने के लिए पर्याप्त स्मार्ट नहीं हो सकता है कि x86_64 सिस्टम पर x86 क्यूटी लाइब्रेरी कहां खोजें।

टूलचैन फ़ाइल होने से एक को एक पैरा कंपाइलर आधार पर एक अलग निर्दिष्ट करने की अनुमति मिलती है, और आप विंडोज वातावरण से 32 बिट्स में संकलन करते समय विकल्प को ट्विक करने में सक्षम होना चाहिए।

आजकल यह अतिरिक्त काम है क्योंकि x86_64 लिनक्स ओएस से 32 बिट संकलित करने के बाद यह बहुत अधिक मामूली है, लेकिन यह समाधान अन्य विदेशी सेटअप के लिए काम करेगा।

toolchain फ़ाइल के बारे में अधिक जानकारी के लिए, एक उदाहरण के लिए देख सकते हैं:

+3

'सेमेक/पथ/से/स्रोत-डीसीएमकेE_CXX_FLAGS = -m32 -DCMAKE_C_FLAGS = -m32' हो सकता है जब एक टूलचैन फ़ाइल थोड़ी अधिक हो सकती है, लेकिन ये दोनों एकमात्र उचित तरीके हैं इस स्थिति को संभालने का। CMakeLists.txt में इस तरह की "जानकारी" नहीं होनी चाहिए। जब तक ओपी 64-बिट संकलन को कभी भी होने से रोकना नहीं चाहता। – rubenvb

+0

@rubenvb जैसा कि मेरी पोस्ट में बताया गया है, आपको अभी भी 'find_package (Qt) ' – malat

+0

जैसे इस तकनीक और सेमेक 3.9.3 का उपयोग करके सेमेक को संभालने में मदद करने के लिए' CMAKE_FIND_ROOT_PATH 'की आवश्यकता है, टूलचैन में परिभाषित CMAKE_CXX_FLAGS को पहली बार बाल परियोजनाओं में प्रचारित नहीं किया गया था मैं निर्माण निर्देशिका बना रहा हूँ। लेकिन यदि आप मौजूदा निर्माण निर्देशिका को हटाए बिना बिल्ड निर्देशिका बनाने के लिए दूसरी बार कमांड चलाते हैं तो व्यवहार बदलता है !!! मुझे बिल्कुल पता नहीं है कि यह एक सामान्य विशेषता है या नहीं ... समस्या को हल करने के लिए, मैंने टूलकेन फ़ाइल में अनुसरण के रूप में CMAKE_CXX_FLAGS को परिभाषित किया है: 'सेट (CMAKE_CXX_FLAGS "$ {CMAKE_CXX_FLAGS} -m32" कैच STRING "C++ झंडे") ' – sancelot

1

मैं malat के दृष्टिकोण का इस्तेमाल किया और एक Toolchain फ़ाइल बनाया है।

मेरे पास एक टूलचैन फ़ाइल है जो कुछ लिनक्स डिस्क्स पर काम करती है, शायद यह आपको प्रेरणा देगा। यह या आप के लिए काम कर सकते हैं के रूप में, या आप अन्य cmake स्क्रिप्ट आप काम करने के लिए पर भरोसा करते हैं पाने के लिए अन्य बदसूरत हैक्स आवश्यकता हो सकती है w/ई:

https://github.com/visualboyadvance-m/visualboyadvance-m/blob/master/cmake/Toolchain-cross-m32.cmake