2014-04-30 2 views
7

tl; डॉ
मैं कैसे एक स्थिर पुस्तकालय के खिलाफ लिंक करने के लिए iOS चलाने वाले आईपैड ठिकानों पर किए गए एप्लिकेशन के लिए उपयुक्त फाइल करने के लिए एडीए स्रोत कोड संकलन कर सकते हैं? (जीसीसी एक आवश्यकता नहीं है। LLVM का उपयोग कर समाधान या दूसरों का भी स्वागत है!)
एडीए पार संकलक को लक्षित करता


मैं पोर्टेबल एडीए कोड है कि मैं एक iPad/iOS परियोजना में उपयोग करना चाहते हैं का एक बड़ा पुस्तकालय है। मेरा होस्ट ओएस मैक ओएस एक्स 10.9 है (मैकपॉर्ट्स के साथ /opt/local पर स्थापित जीसीसी 4.8.1 चल रहा है)। ऐसा करने के लिए, मैं एडीए समर्थन के साथ एक जीसीसी एआरएम क्रॉस-कंपाइलर बनाने की कोशिश कर रहा हूं।

मैं एक काम कर जीसीसी और GNAT कि एआरएम निष्पादनयोग्य बनाता निर्माण करने में सक्षम हूँ, लेकिन मैं बनाने या एडीए मानक पुस्तकालय, जो मेरे एडीए कोड

स्रोत संकुल के निर्माण के लिए आवश्यक है स्थापित करने के लिए नहीं कर पा रहे मैं 'm का उपयोग कर:

gcc-4.8.1 
binutils-2.24 
libiconv-1.14 
gmp-5.1.3 
mpc-1.0.2 
mpfr-3.1.2 

जीसीसी का निर्माण विन्यास:

$ bin/arm-none-eabi-gcc -v --version 
Using built-in specs. 
COLLECT_GCC=bin/arm-none-eabi-gcc 
COLLECT_LTO_WRAPPER=/Users/ardnew/cross/libexec/gcc/arm-none-eabi/4.8.1/lto-wrapper 
arm-none-eabi-gcc (GCC) 4.8.1 
Copyright (C) 2013 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 


Target: arm-none-eabi 
Configured with: /Users/ardnew/cross/src/gcc-4.8.1/configure --target=arm-none-eabi --prefix=/Users/ardnew/cross --with-cpu=cortex-a8 --enable-languages=c,ada --disable-multilib --enable-interwork --disable-threads --disable-shared --disable-nls --disable-lto --disable-libssp --disable-decimal-float --disable-libgomp --disable-libmudflap 
Thread model: single 
gcc version 4.8.1 (GCC) 
COLLECT_GCC_OPTIONS='-v' '--version' '-mcpu=cortex-a8' 
/Users/ardnew/cross/libexec/gcc/arm-none-eabi/4.8.1/cc1 -quiet -v -D__USES_INITFINI__ help-dummy -quiet -dumpbase help-dummy -mcpu=cortex-a8 -auxbase help-dummy -version --version -o /var/folders/4c/y_sll7bj6b9bt15389wr66_80000gn/T//ccrSSKFx.s 
GNU C (GCC) version 4.8.1 (arm-none-eabi) 
    compiled by GNU C version 4.8.1, GMP version 5.1.3, MPFR version 3.1.2, MPC version 1.0.2 
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 
COLLECT_GCC_OPTIONS='-v' '--version' '-mcpu=cortex-a8' 
/Users/ardnew/cross/lib/gcc/arm-none-eabi/4.8.1/../../../../arm-none-eabi/bin/as -mcpu=cortex-a8 -meabi=5 --version -o /var/folders/4c/y_sll7bj6b9bt15389wr66_80000gn/T//ccZYvQLp.o /var/folders/4c/y_sll7bj6b9bt15389wr66_80000gn/T//ccrSSKFx.s 
GNU assembler (GNU Binutils) 2.24 
Copyright 2013 Free Software Foundation, Inc. 
This program is free software; you may redistribute it under the terms of 
the GNU General Public License version 3 or later. 
This program has absolutely no warranty. 
This assembler was configured for a target of `arm-none-eabi'. 
COMPILER_PATH=/Users/ardnew/cross/libexec/gcc/arm-none-eabi/4.8.1/:/Users/ardnew/cross/libexec/gcc/arm-none-eabi/4.8.1/:/Users/ardnew/cross/libexec/gcc/arm-none-eabi/:/Users/ardnew/cross/lib/gcc/arm-none-eabi/4.8.1/:/Users/ardnew/cross/lib/gcc/arm-none-eabi/:/Users/ardnew/cross/lib/gcc/arm-none-eabi/4.8.1/../../../../arm-none-eabi/bin/ 
LIBRARY_PATH=/Users/ardnew/cross/lib/gcc/arm-none-eabi/4.8.1/:/Users/ardnew/cross/lib/gcc/arm-none-eabi/4.8.1/../../../../arm-none-eabi/lib/ 
COLLECT_GCC_OPTIONS='-v' '--version' '-mcpu=cortex-a8' 
/Users/ardnew/cross/libexec/gcc/arm-none-eabi/4.8.1/collect2 -X --version /Users/ardnew/cross/lib/gcc/arm-none-eabi/4.8.1/crti.o /Users/ardnew/cross/lib/gcc/arm-none-eabi/4.8.1/crtbegin.o crt0.o -L/Users/ardnew/cross/lib/gcc/arm-none-eabi/4.8.1 -L/Users/ardnew/cross/lib/gcc/arm-none-eabi/4.8.1/../../../../arm-none-eabi/lib /var/folders/4c/y_sll7bj6b9bt15389wr66_80000gn/T//ccZYvQLp.o --start-group -lgcc -lc --end-group /Users/ardnew/cross/lib/gcc/arm-none-eabi/4.8.1/crtend.o /Users/ardnew/cross/lib/gcc/arm-none-eabi/4.8.1/crtn.o 
collect2 version 4.8.1 
/Users/ardnew/cross/lib/gcc/arm-none-eabi/4.8.1/../../../../arm-none-eabi/bin/ld -X --version /Users/ardnew/cross/lib/gcc/arm-none-eabi/4.8.1/crti.o /Users/ardnew/cross/lib/gcc/arm-none-eabi/4.8.1/crtbegin.o crt0.o -L/Users/ardnew/cross/lib/gcc/arm-none-eabi/4.8.1 -L/Users/ardnew/cross/lib/gcc/arm-none-eabi/4.8.1/../../../../arm-none-eabi/lib /var/folders/4c/y_sll7bj6b9bt15389wr66_80000gn/T//ccZYvQLp.o --start-group -lgcc -lc --end-group /Users/ardnew/cross/lib/gcc/arm-none-eabi/4.8.1/crtend.o /Users/ardnew/cross/lib/gcc/arm-none-eabi/4.8.1/crtn.o 
GNU ld (GNU Binutils) 2.24 
Copyright 2013 Free Software Foundation, Inc. 
This program is free software; you may redistribute it under the terms of 
the GNU General Public License version 3 or (at your option) a later version. 
This program has absolutely no warranty. 

टेस्ट प्रोग्राम को इसके निर्माण एआरएम बाइनरी सुनिश्चित करने के लिए:

$ cat told_unit1.adb told_unit1.ads 

-- 
-- FILE: told_unit1.adb 
-- 
with Ada.Text_IO; 
use Ada.Text_IO; 

package body told_unit1 is 

    procedure hello is 
    begin 
    put_line("hello, world"); 
    end hello; 

    function double(x : in float) return float is 
    begin 
    return x + x; 
    end double; 

end told_unit1; 


-- 
-- FILE: told_unit1.ads 
-- 
package told_unit1 is 

    procedure hello; 
    pragma Export 
    (
    convention  => C, 
    entity   => hello, 
    external_name => "ada_hello" 
); 

    function double(x : in float) return float; 
    pragma Export 
    (
    convention  => C, 
    entity   => double, 
    external_name => "ada_double" 
); 

end told_unit1; 

तो एडीए कोड संकलन और file के साथ निरीक्षण:

$ arm-none-eabi-gcc -c told_unit1.adb 

$ file told_unit1.o 
told_unit1.o: ELF 32-bit LSB relocatable, ARM, version 1 (SYSV), not stripped 

और फिर जब मैं पुस्तकालय वस्तु फ़ाइल यह pukes बाध्य करने के लिए प्रयास करें:

$ arm-none-eabi-gnatbind -aO$ADA_OBJECT_PATH -Ltold told_unit1 
error: "a-textio.ali" not found, "a-textio.adb" must be compiled 

मेरी जीसीसी के लिए वापस जा रहे हैं लॉग बनाएं, मैंने पाया कि libada (जो मुझे विश्वास है कि जीएनएटी का हिस्सा है) कभी नहीं बनाया गया था। जब मैं जीसीसी का निर्माण निर्देशिका से make all-target-libada चलाने का प्रयास, यह अंततः मुझसे कहता है:

Configuring in arm-none-eabi/libada 
configure: loading cache ./config.cache 
checking build system type... x86_64-apple-darwin13.1.0 
checking host system type... arm-none-eabi 
checking target system type... arm-none-eabi 
checking for arm-none-eabi-gcc... /Users/ardnew/cross/src/gcc-4.8.1-obj/./gcc/xgcc -B/Users/ardnew/cross/src/gcc-4.8.1-obj/./gcc/ -B/Users/ardnew/cross/arm-none-eabi/bin/ -B/Users/ardnew/cross/arm-none-eabi/lib/ -isystem /Users/ardnew/cross/arm-none-eabi/include -isystem /Users/ardnew/cross/arm-none-eabi/sys-include 
checking for C compiler default output file name... 
configure: error: in `/Users/ardnew/cross/src/gcc-4.8.1-obj/arm-none-eabi/libada': 
configure: error: C compiler cannot create executables 
See `config.log' for more details. 
make: *** [configure-target-libada] Error 1 

और इसलिए मैं का निरीक्षण है कि अपने की चर्चा करते हुए config.log और निम्नलिखित को खोजने जाना:

configure:2351: $? = 0 
configure:2340: /Users/ardnew/cross/src/gcc-4.8.1-obj/./gcc/xgcc -B/Users/ardnew/cross/src/gcc-4.8.1-obj/./gcc/ -B/Users/ardnew/cross/arm-none-eabi/bin/ -B/Users/ardnew/cross/arm-none-eabi/lib/ -isystem /Users/ardnew/cross/arm-none-eabi/include -isystem /Users/ardnew/cross/arm-none-eabi/sys-include -v >&5 
COLLECT_LTO_WRAPPER=/Users/ardnew/cross/src/gcc-4.8.1-obj/./gcc/lto-wrapper 
Target: arm-none-eabi 
Configured with: /Users/ardnew/cross/src/gcc-4.8.1/configure --target=arm-none-eabi --prefix=/Users/ardnew/cross --with-cpu=cortex-a8 --enable-languages=c,ada --disable-multilib --enable-interwork --disable-threads --disable-shared --disable-nls --disable-lto --disable-libssp --disable-decimal-float --disable-libgomp --disable-libmudflap 
configure:2351: $? = 0 
xgcc: error: unrecognized command line option '-qversion' 
xgcc: fatal error: no input files 
compilation terminated. 
configure:2351: $? = 1 
configure:2371: checking for C compiler default output file name 
configure:2393: /Users/ardnew/cross/src/gcc-4.8.1-obj/./gcc/xgcc -B/Users/ardnew/cross/src/gcc-4.8.1-obj/./gcc/ -B/Users/ardnew/cross/arm-none-eabi/bin/ -B/Users/ardnew/cross/arm-none-eabi/lib/ -isystem /Users/ardnew/cross/arm-none-eabi/include -isystem /Users/ardnew/cross/arm-none-eabi/sys-include -g -O2 conftest.c >&5 
/Users/ardnew/cross/arm-none-eabi/bin/ld: cannot find crt0.o: No such file or directory 
/Users/ardnew/cross/arm-none-eabi/bin/ld: cannot find -lg 
/Users/ardnew/cross/arm-none-eabi/bin/ld: cannot find -lc 
collect2: error: ld returned 1 exit status 
configure:2397: $? = 1 
configure:2434: result: 
configure: failed program was: 
| /* confdefs.h */ 
| #define PACKAGE_NAME "" 
| #define PACKAGE_TARNAME "" 
| #define PACKAGE_VERSION "" 
| #define PACKAGE_STRING "" 
| #define PACKAGE_BUGREPORT "" 
| #define PACKAGE_URL "" 
| /* end confdefs.h. */ 
| 
| int 
| main() 
| { 
| 
| ; 
| return 0; 
| } 
configure:2440: error: in `/Users/ardnew/cross/src/gcc-4.8.1-obj/arm-none-eabi/libada': 
configure:2444: error: C compiler cannot create executables 
See `config.log' for more details. 

तो पर इस बिंदु पर मैं अपने सिर पर रास्ता हूं और वास्तव में यह सुनिश्चित नहीं करता कि आगे क्या करना है। ऐसा लगता है कि मैं एआरएम के लिए सी रनटाइम लाइब्रेरी खो रहा हूं?

एआरएम लक्ष्यों के लिए जीएनएटी/लीबिया को कॉन्फ़िगर करने में कोई भी मदद महान होगी।

वैकल्पिक रूप से- क्या एक्सकोड आईओएस प्रोजेक्ट से एडा पुस्तकालयों के खिलाफ लिंक करने का एक आसान तरीका है?

+0

आप की जाँच करनी चाहिए आप 'हाथ-नन-eabi' पार संकलक ELF या माचो binaries पैदा कर रहा है कि क्या - बाद दोनों MacOSX के लिए आवश्यक है, लेकिन मैं दृढ़ता से संदेह है कि विन्यास ELF, जो आप उपयोग नहीं कर सकते का उत्पादन करेगा। यह एक बड़ी समस्या नहीं है, लेकिन आपको स्वयं को मैक-ओ समर्थन के साथ एक क्रॉस-कंपाइलिंग जीसीसी और बिन-यूटिल बनाने की आवश्यकता हो सकती है। – marko

+0

'हाथ-नन-EABI-gcc' @marko ELF डिब्बे का निर्माण किया जाता है (पाठ की दीवार के लिए खेद है, लेकिन कोड ब्लॉक मैं ऊपर से 4 चिपकाया जाँच), और आप एक असली पर लक्ष्य आईओएस कह रहे हैं, भौतिक आईपैड मैक-ओ प्रारूप की उम्मीद कर रहा है और ईएलएफ नहीं? अगर मैं प्रारूप बदलता हूं, तो मेरा मानना ​​है कि मेरी वर्तमान समस्या अभी भी मौजूद होगी हालांकि – ardnew

+2

हां। ईएलएफ ऑब्जेक्ट फाइलें मैकोज़क्स या आईओएस पर आपके लिए उपयोग नहीं करती हैं क्योंकि वे केवल मैक-ओ ऑब्जेक्ट फाइलों और साझा पुस्तकालयों का उपयोग करते हैं। वह एआरएम एबीआई भी कमजोर है। मैं उम्मीद करता हूं कि आईओएस पर एआरएम के लिए लक्षित जीसीसी के पास एक हाथ 'आर्म-सेब-डार्विन-' उपसर्ग या कुछ समान होगा। आपका त्रुटियों अच्छी तरह से निष्पादन योग्य फ़ाइल स्वरूप मेल नहीं खाता से संबंधित हो सकता। – marko

उत्तर

1

दुर्भाग्यवश, उत्तर यह है कि इसे पूरा करने के लिए कोई ऑटो-जादू उपकरण नहीं है। आप इस तथ्य के बाद अनुवादों को प्रमाणित करने के लिए टूलींग का उपयोग कर सकते हैं, लेकिन जो भी आप चाहते हैं वह अभी तक उपलब्ध नहीं है।

मुझे अतीत में इसी प्रश्न से निपटना पड़ा है। एक अलग जवाब ने मेरे प्रोजेक्ट के बजट में भी नाटकीय रूप से बदलाव किया होगा। शायद किसी दिन।

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

संबंधित मुद्दे