 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Čet Jan 20, 2011 11:29 pm Naslov sporočila: [SOLVED] Od izvornih datotek do statične knjižnice. (UBUNTU) |
|
|
Živijo!
Me zanima ali kdo ve, kako si lahko iz izvornih datotek sestavim kakršno koli knjižnico, katero lahko nato uvažam v programe.
Situacija je, da sem dobil izvorno kodo za ADC, PWM, timerje, ... za procesor LPC3141 in sedaj moram iz teh datotek, ki so imenovane:
lpc313x_pwm_driver.c
lpc313x_timer_driver.c
lpc313x_adc10b_driver.c
Imam tudi header datoteke posledično imenovane:
lpc313x_pwm_driver.h
lpc313x_timer_driver.h
lpc313x_adc10b_driver.h
Kako lahko sedaj iz teh datotek na Linuxu sestavim knjižnico, da jo bom lahko nemoteno uporabljal. Zanima me še, ali so izvorne datoteke napisane tako, da so neodvisne od operacijskega sistema?
Že vnaprej se zahvaljujem za odgovore.
Nazadnje urejal/a 71GA Sre Mar 16, 2011 11:33 am; skupaj popravljeno 1 krat |
|
Nazaj na vrh |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Pet Jan 21, 2011 9:26 am Naslov sporočila: |
|
|
Še nekaj me zanima. V kolikor prevedem program z uporabo ukaza
Koda: |
arm-none-eabi-gcc -mcpu=926ej-s -Wall -g |
Ali je potrebno objekte knjižnice prevesti z istim ukazom (z dodatkom -c), da bodo delovale na arm?
Koda: |
arm-none-eabi-gcc -mcpu=926ej-s -Wall -g -c |
Če sem, prav razumel vodiče po spletu moram najprej prevesti vse source datoteke z zgornjim ukazom v objektne datoteke, katere potem nekako povežem v knjižnico z archieverjem...
Koda: |
ar -cvq mojaknjiznica.a <tu navedemo objektne datoteke> |
Ko je knjižnica ustvarjena bojda lahko preverimo, kateri objekti so v knjižnici. To storimo s spodnjim ukazom.
Koda: |
ar -t mojaknjiznica.a |
In na koncu je bojda potrebno knjiznico povezati s programom (npr. prog.c). To lahko storimo na več načinov:
Koda: |
cc -o executable-name prog.c mojaknjiznica.a
cc -o executable-name prog.c -L/.../.../.../mojaknjiznica.a -lctest |
|
|
Nazaj na vrh |
|
 |
MarkoM Član

Pridružen-a: Tor 12 Sep 2006 15:29 Prispevkov: 2825 Aktiv.: 12.34 Kraj: Lovrenc na P.
|
Objavljeno: Pet Jan 21, 2011 9:44 am Naslov sporočila: |
|
|
V program includaš header datoteke in je to to. Mogoče bi bilo bolje, da bi se počasi začel ukvarjati s C programiranjem... v enem IDE-ju... |
|
Nazaj na vrh |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Pet Jan 21, 2011 10:08 am Naslov sporočila: |
|
|
MarkoM je napisal/a: |
V program includaš header datoteke in je to to. Mogoče bi bilo bolje, da bi se počasi začel ukvarjati s C programiranjem... v enem IDE-ju... |
Mislim, da ni tako enostavno, ker moja knjižnica še ni sploh narejena in jo zatorej ne morem klicati s headerji. Zakaj se ne ukvarjam z IDE? Zdi se mi, da IDE zakrije preveč stvari, ki so pomembne za celovito razumevanje. Sploh pa je to zakrivanje prisotno na operacijskem sistemu Windows, kjer operacijski sistem vse naredi kar sam... V kolikor, bi rad potlej delal kaj resnega vedno končaš tu kot jaz. Se pravi v ukazni vrstici operacijskega sistema Linux .  |
|
Nazaj na vrh |
|
 |
MarkoM Član

Pridružen-a: Tor 12 Sep 2006 15:29 Prispevkov: 2825 Aktiv.: 12.34 Kraj: Lovrenc na P.
|
Objavljeno: Pet Jan 21, 2011 11:03 am Naslov sporočila: |
|
|
Če imaš .c datoteke s funkcijami in pripadajoče header datoteke, kjer so sklici na funkcije mi ni jasno kaj sploh sprašuješ.
Kjer hočeš uporabiti funkcijo iz tvojih .c datotek pač includaš header v katerem je sklic na tvojo funkcijo. Potem pa v programu enostavno kličeš funkcijo. Pa nima veze ali je windows ali linux ili nešto između.
Seveda moraš pa nekje navesti prevajalniku pot do tvojih .c datotek. |
|
Nazaj na vrh |
|
 |
chaos Član


Pridružen-a: Sob 16 Sep 2006 22:12 Prispevkov: 1063 Aktiv.: 4.65 Kraj: Zagorje ob Savi
|
Objavljeno: Pet Jan 21, 2011 11:52 am Naslov sporočila: |
|
|
markom: ocitno hoce narediti svojo knjiznico, ne pa prevesti nekaj izvornih datotek v samostojec program, to je dovolj jasno napisano. Mogoce se splaca kdaj pa kdaj uporabit ukazno vrstico namesto IDE-ja, da so taksne stvari bolj jasne.
71GA, moje spostovanje za trud, sem prav presenecen, ker vecina ljudi dandanes isce samo najlazjo pot do nekega rezultata, pa ce se zraven kaj naucijo ali pa ne. Ce bos kdaj resno delal z embedded sistemi ali pa mogoce celo nacrtoval lastne SOC-je, ti bo taksno znanje se zelo prav prislo.
Vendar se vedno premalo uporabljas Google Kako narediti staticno knjiznico je zelo dobro razlozeno na vec mestih.
Vsi koraki, ki si jih napisal, so pravilni. Uporabi jih!
71GA je napisal/a: |
Še nekaj me zanima. V kolikor prevedem program z uporabo ukaza
Koda: |
arm-none-eabi-gcc -mcpu=926ej-s -Wall -g |
Ali je potrebno objekte knjižnice prevesti z istim ukazom (z dodatkom -c), da bodo delovale na arm?
Koda: |
arm-none-eabi-gcc -mcpu=926ej-s -Wall -g -c |
|
A tukaj te zanima ce je pomemben izbor arhitekture (-mcpu)? Seveda je, knjiznica mora biti prevedena za isti procesor kot tvoj program - knjniznica je namrec ze prevedena v strojni jezik, vse kar se naredi pri linkanju je relokacija kode in absolutno oz. relativno pozicioniranje spremenljivk in skokov.
LP! |
|
Nazaj na vrh |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Pet Jan 21, 2011 9:58 pm Naslov sporočila: |
|
|
Res hvala za tole pomoč in usmeritve fantje. Bom poročal, če mi bo uspelo sestaviti knjižnico. |
|
Nazaj na vrh |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Sob Jan 22, 2011 7:06 pm Naslov sporočila: |
|
|
Mi je uspelo s spodnjim ukazom ustvarit statično knjižnico polno objektov.
Koda: |
ar -cvq liblpc3141.a ea3141_board.o ea3141_spinor.o libnosys_gnu.o lpc313x_adc10b_driver.o lpc313x_cgu_default.o lpc313x_cgu_driver.o lpc313x_crc_driver.o lpc313x_dma_driver.o lpc313x_evt_driver.o lpc313x_i2c_driver.o lpc313x_i2s_driver.o lpc313x_intc_driver.o lpc313x_ipint_driver.o lpc313x_mci_driver.o lpc313x_nand_driver.o lpc313x_pca9532_driver.o lpc313x_pwm_driver.o lpc313x_spi_driver.o lpc313x_timer_driver.o lpc313x_uart_driver.o lpc313x_wdt_driver.o lpc315x_otp_driver.o lpc315x_psu_driver.o lpc315x_rtc_driver.o lpc_api.o lpc_arm922t_cp15_driver.o lpc_bmp.o lpc_colors.o lpc_fat16.o lpc_fat16_private.o lpc_fonts.o lpc_heap.o lpc_helvr10.o lpc_lbecc.o lpc_lcd_params.o lpc_line_parser.o lpc_nandflash_params.o lpc_rom8x16.o lpc_rom8x8.o lpc_string.o lpc_swim_font.o lpc_swim_image.o lpc_swim.o lpc_winfreesystem14x16.o lpc_x5x7.o lpc_x6x13.o
|
Na žalost, ko knjižnico želim skompilati skupaj s katerim koli programom mi vrže napako v zvezi s header datoteko (vedno ista header datoteka).
Koda: |
arm-none-eabi-gcc -mcpu=arm926ej-s -Wall -g -o executable pwm_example.c liblpc3141.a
In file included from pwm_example.c:23:0:
lpc_irq_fiq.h:28:26: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'disable_irq'
lpc_irq_fiq.h:43:24: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'disable_fiq'
lpc_irq_fiq.h:58:24: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'disable_irq_fiq'
lpc_irq_fiq.h:73:24: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'enable_irq'
lpc_irq_fiq.h:88:24: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'enable_fiq'
lpc_irq_fiq.h:103:24: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'enable_irq_fiq'
lpc_irq_fiq.h:118:24: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'disable_irq_fiq_mask'
lpc_irq_fiq.h:135:24: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'enable_irq_fiq_mask'
lpc_irq_fiq.h:152:24: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'restore_exceptions'
pwm_example.c: In function 'c_entry':
pwm_example.c:82:3: warning: implicit declaration of function 'disable_irq_fiq'
pwm_example.c:94:3: warning: implicit declaration of function 'enable_irq'
|
Sem gledal header pa ne vem, kje bi lahko bila napaka. |
|
Nazaj na vrh |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Ned Jan 23, 2011 1:44 pm Naslov sporočila: |
|
|
Evo napredek je... Našel sem startup source kodo startup.asm in vektor kodo vectors.asm, kateri sem spremenil v objekte in ju dodal v knjižnico. Poleg tega sem ugotovil, da sem uporabljal napačen ukaz za grajenje knjižnice. Namesto ar je potrebno uporabiti arm-none-eabi-ar in tako vse objekte skupaj z novima dvema povezati v knjižnico liblpc3141.a.
Ko želim prevesti primer programa skupaj s knjižnico, mi tokrat vrže veliko manj napak, kar pomeni, da se bližam rešitvi. Mislim, da sem že zelo blizu, ima mogoče kdo kako idejo, kaj mi še manjka. Tu je poročilo, ki ga dobim pri prevajanju:
Koda: |
arm-none-eabi-gcc -g -Wall -mcpu=arm926ej-s adc_example.c liblpc3141.a -o executable
/home/ziga/projects/cs_lite/bin/../lib/gcc/arm-none-eabi/4.5.1/../../../../arm-none-eabi/bin/ld: warning: cannot find entry symbol _start; defaulting to 00008018
/home/ziga/projects/cs_lite/bin/../lib/gcc/arm-none-eabi/4.5.1/../../../../arm-none-eabi/lib/libc.a(lib_a-sbrkr.o): In function `_sbrk_r':
sbrkr.c:(.text+0x18): undefined reference to `_sbrk'
collect2: ld returned 1 exit status
|
|
|
Nazaj na vrh |
|
 |
chaos Član


Pridružen-a: Sob 16 Sep 2006 22:12 Prispevkov: 1063 Aktiv.: 4.65 Kraj: Zagorje ob Savi
|
Objavljeno: Ned Jan 23, 2011 2:28 pm Naslov sporočila: |
|
|
Ta napaka se verjetno navezuje na manjkajoče sistemske klice, o čemer smo govorili v eni drugi temi. Napačna linker skripta mogoče?
Definitivno pa najprej poskusi pravilno vključiti knjižnico, npr:
Koda: |
gcc -static -Ipot/do/header/datotek -Lpot/do/knjiznice -llpc3141 |
Torej namesto da jo podaš kot izvorno datoteko gcc-ju (liblpc3141.a) napiši zgornje.
LP! |
|
Nazaj na vrh |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Sob Jan 29, 2011 8:17 pm Naslov sporočila: |
|
|
Okej no sem poiskusil tako, kot si mi predlagal in dobim isto napako kot prej, ki je očitno povezana z linker skripto, o čemer sva razpravljala že v drugi temi.
Koda: |
arm-none-eabi-gcc -Wall -mcpu=arm926ej-s adc_example.c -static -L/home/ziga/Desktop/test_lib -I/home/ziga/Desktop/test_lib -llpc3141
/home/ziga/projects/cs_lite/bin/../lib/gcc/arm-none-eabi/4.5.1/../../../../arm-none-eabi/bin/ld: warning: cannot find entry symbol _start; defaulting to 00008018
/home/ziga/projects/cs_lite/bin/../lib/gcc/arm-none-eabi/4.5.1/../../../../arm-none-eabi/lib/libc.a(lib_a-sbrkr.o): In function `_sbrk_r':
sbrkr.c:(.text+0x18): undefined reference to `_sbrk'
collect2: ld returned 1 exit status
|
Očitno ne najde funkcij: _start, _sbrk_r
Nekaj linker skript je v neki podmapi programa codesourcery, kjer bi poiskusil z skripto "generic.ld" a ne vem, kako jo podati compilerju. Ali lahko to storim z opcijo -T in kako? Hvala.
Za mankajočimi funkcijami bom še malo pogledal na spletu in bom se oglasil, ko bom kaj novega odkril. Drugače pa obljubim, da o tem posnamem video, katerega bom objavil na youtubu in v več delih. Seveda, ko mi uspe. |
|
Nazaj na vrh |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Sob Jan 29, 2011 8:32 pm Naslov sporočila: |
|
|
No tako, ko uporabim linker skripto "generic.ld" dobim drugačen output. Zgoraj omenjenih pa ni več.
Koda: |
arm-none-eabi-gcc -Wall -mcpu=arm926ej-s adc_example.c -static -L/home/ziga/Desktop/test_lib -I/home/ziga/Desktop/test_lib -llpc3141 -Tgeneric.ld
/home/ziga/projects/cs_lite/bin/../lib/gcc/arm-none-eabi/4.5.1/../../../../arm-none-eabi/lib/libcs3.a(start_c.o): In function `__cs3_premain':
start_c.c:(.text+0x28): undefined reference to `main'
collect2: ld returned 1 exit status
|
Očitno je še neka napaka v linker skripti v funkciji __cs3_premain... |
|
Nazaj na vrh |
|
 |
chaos Član


Pridružen-a: Sob 16 Sep 2006 22:12 Prispevkov: 1063 Aktiv.: 4.65 Kraj: Zagorje ob Savi
|
Objavljeno: Sob Jan 29, 2011 9:40 pm Naslov sporočila: |
|
|
Koda: |
undefined reference to `main' |
To pomeni, da ne najde funkcije main. Verjetno manjka v tvojem .c fajlu. Ali pa nisi podal prave datoteke linkerju.
LP! |
|
Nazaj na vrh |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Sob Jan 29, 2011 10:57 pm Naslov sporočila: |
|
|
Ali to pomeni, da sem rešil prejšnji dve napaki? S tem mislim mankajoči funkciji _start in _sbrk_r. Ali kdo mogoče ve za kako dobro literaturo o ustvarjanju svojih lastnih knjižnic, linker skript, startup fajlov, kjer bi bilo vse to razloženo? |
|
Nazaj na vrh |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Sre Mar 16, 2011 11:32 am Naslov sporočila: |
|
|
chaos je napisal/a: |
Koda: |
undefined reference to `main' |
To pomeni, da ne najde funkcije main. Verjetno manjka v tvojem .c fajlu. Ali pa nisi podal prave datoteke linkerju.
LP! |
Sem pisal na embedded artists in so mi rekli isto. Tako da v bistvu sem pravilno sestavil knjižnico, toda zafrknil sem pri c fajlu.
Hvala Chaos. |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 6 dni
Powered by phpBB © 2001, 2005 phpBB Group
|