Daniel Jaworski
Guest
Tue Jun 12, 2007 3:16 pm
Próbuję uruchomić projekt oparty o Ethernut.
Wszystko sie kompiluje poprawnie. Mam problem z linkerem.
Robię tak:
avr-g++ -Wl,--defsym=main=0,-Map=main.map,--cref -L /home/daniel/nut/lib
-lnutarch -lnutcpp -lnutcrt -lnutcrtf -lnutdev -lnutfs -lnutnet
-lnutos -lnutpro -o prog-test.elf ./prog-test.o
na co gcc odpowiada:
/prog-test.o(.text+0x70): In function `_cxx_main_()':
: undefined reference to `devUsartAvr0'
../prog-test.o(.text+0x72): In function `_cxx_main_()':
: undefined reference to `devUsartAvr0'
../prog-test.o(.text+0x74): In function `_cxx_main_()':
: undefined reference to `NutRegisterDevice'
../prog-test.o(.text+0x80): In function `_cxx_main_()':
: undefined reference to `fopen'
../prog-test.o(.text+0x86): In function `_cxx_main_()':
: undefined reference to `_fileno'
../prog-test.o(.text+0x94): In function `_cxx_main_()':
: undefined reference to `_ioctl'
../prog-test.o(.text+0x98): In function `_cxx_main_()':
: undefined reference to `NutVersionString'
A wiem że w dołączanych bibliotekach są te funkcje.
np.
$ avr-objdump -x ~/nut/lib/libnutarch.a | grep devUsartAvr
00000000 g O .data 00000023 devUsartAvr0
00000000 g O .data 00000023 devUsartAvr1
Co robię źle?
Pozdrawiam!
--
Daniel
Daniel Jaworski
Guest
Tue Jun 12, 2007 3:50 pm
Daniel Jaworski wrote:
Mała aktualizacja.
Po usunięciu wszystkich plików wynikowych i ponownym przekompilowaniu
projektu mam coś takiego:
$avr-g++ -L/home/daniel/nut/lib/ -L/home/daniel/nut/lib/nutinit.o
-mmcu=atmega128 -Wl,--defsym=main=0,-Map=main.map,--cref -oprog-test.elf
../prog-test.o -lnutarch -lnutcpp -lnutcrt -lnutdev -lnutfs -lnutnet
-lnutos -lnutpro
/home/daniel/nut/lib//libnutos.a(thread.o)(.text+0x190): In function
`NutThreadResume':
: undefined reference to `NutThreadSwitch'
/home/daniel/nut/lib//libnutos.a(thread.o)(.text+0x2bc): In function
`NutThreadSetPriority':
: undefined reference to `NutThreadSwitch'
Ale jest to dalej dziwne, ponieważ funkcja NutThreadSwitch jest
zaimplementowana w libnutarch.a:
$ avr-objdump -x ~/nut/lib/libnutarch.a | grep NutThreadSwitch
00000010 g F .text 0000007e NutThreadSwitch
--
Daniel
Paweł Więcek
Guest
Tue Jun 12, 2007 8:06 pm
Thus wrote Daniel Jaworski <danielj_no_spam@poczta.fm>:
Quote:
Ale jest to dalej dziwne, ponieważ funkcja NutThreadSwitch jest
zaimplementowana w libnutarch.a:
Kolejność bibliotek ma znaczenie.
Paweł
--
(___) | Pawel Wiecek ----------------- Coven / Svart --------------------- |
< o o > |
http://www.coven.vmh.net/ <coven@vmh.net> GSM: +48603240006 |
\ ^ / | GPG/PGP info in message headers * [ Debian GNU/Linux developer ] |
(") | * Stop searching forever. Happiness is unattainable. * |
Daniel Jaworski
Guest
Tue Jun 12, 2007 8:55 pm
Paweł Więcek wrote:
[...]
Quote:
Kolejność bibliotek ma znaczenie.
Dziękuję za informację. O to chodziło. Powinni to napisać wielkimi
literami na stronie podręcznika do GCC

.
--
Pozdrawiam,
Daniel
Adam Dybkowski
Guest
Wed Jun 13, 2007 2:17 am
Daniel Jaworski pisze:
Quote:
Kolejność bibliotek ma znaczenie.
Dziękuję za informację. O to chodziło. Powinni to napisać wielkimi
literami na stronie podręcznika do GCC

.
Najprościej jest dołączać wszystkie biblioteki dwukrotnie (najpierw
wymienić w liście cały zestaw a później jeszcze raz to samo), potem nie
ma już problemu kolejności.
--
Adam Dybkowski
http://www.amwaw.edu.pl/~adybkows/
Uwaga: przed wysłaniem do mnie maila usuń cyfry z adresu.
Paweł Więcek
Guest
Wed Jun 13, 2007 8:19 pm
Thus wrote Adam Dybkowski <adybkows12@45wp.pl>:
Quote:
Najprościej jest dołączać wszystkie biblioteki dwukrotnie (najpierw
wymienić w liście cały zestaw a później jeszcze raz to samo), potem nie
ma już problemu kolejności.
Najprościej jest albo przemyśleć kolejność, albo użyć -Wl,-( i -Wl,-).
Z tym ostatnim trzeba wszakże uważać, bo jeśli pozostaną jakieś nierozwiązane
symbole to będzie kuku.
A podwójne dołączenie bibliotek nie gwarantuje sukcesu.
Paweł
--
(___) | Pawel Wiecek ------ Coven / Svart ------
http://www.coven.vmh.net/ |
< o o > | <coven@vmh.net> GPG/PGP info in headers GSM: +48603240006 |
\ ^ / | * A computer without COBOL and Fortran is like a piece * |
(") | * of chocolate cake without ketchup and mustard. * |
Paweł Więcek
Guest
Wed Jun 13, 2007 8:21 pm
Thus wrote Daniel Jaworski <danielj_no_spam@poczta.fm>:
Quote:
Dziękuję za informację. O to chodziło. Powinni to napisać wielkimi
literami na stronie podręcznika do GCC

.
No przecież jest napisane:
|| `-lLIBRARY'
|| `-l LIBRARY'
|| Search the library named LIBRARY when linking. (The second
|| alternative with the library as a separate argument is only for
|| POSIX compliance and is not recommended.)
||
|| It makes a difference where in the command you write this option;
|| the linker searches and processes libraries and object files in
|| the order they are specified. Thus, `foo.o -lz bar.o' searches
|| library `z' after file `foo.o' but before `bar.o'. If `bar.o'
|| refers to functions in `z', those functions may not be loaded.
[...]
Paweł
--
(___) | Pawel Wiecek ------ Coven / Svart ------
http://www.coven.vmh.net/ |
< o o > | <coven@vmh.net> GPG/PGP info in headers GSM: +48603240006 |
\ ^ / | * * * It is a sin to believe evil of others, * * * |
(") | * * * but it is seldom a mistake. -- Mencken |
Adam Dybkowski
Guest
Thu Jun 14, 2007 10:19 pm
Paweł Więcek pisze:
Quote:
Najprościej jest dołączać wszystkie biblioteki dwukrotnie (najpierw
wymienić w liście cały zestaw a później jeszcze raz to samo), potem nie
ma już problemu kolejności.
Najprościej jest albo przemyśleć kolejność, albo użyć -Wl,-( i -Wl,-).
Z tym ostatnim trzeba wszakże uważać, bo jeśli pozostaną jakieś nierozwiązane
symbole to będzie kuku.
O przemyśleniu kolejności w niektórych większych projektach zwykle nie
ma mowy, bo bibliotek jest wiele a funkcje się skutecznie "zazębiają".
Jeszcze się nie naciąłem na sytuację, gdzie niepoprawnie zadziałałoby
(lub nie zadziałało) podwójne wypisanie zestawu na liście dla linkera.
Quote:
A podwójne dołączenie bibliotek nie gwarantuje sukcesu.
Podaj przykład.
--
Adam Dybkowski
http://www.amwaw.edu.pl/~adybkows/
Uwaga: przed wysłaniem do mnie maila usuń cyfry z adresu.
Paweł Więcek
Guest
Sat Jun 16, 2007 12:18 pm
Thus wrote Adam Dybkowski <adybkows12@45wp.pl>:
Quote:
O przemyśleniu kolejności w niektórych większych projektach zwykle nie
ma mowy, bo bibliotek jest wiele a funkcje się skutecznie "zazębiają".
To wtedy należałoby mocno przemyśleć architekturę całego projektu, bo
pozostawia wiele do życzenia.
Quote:
A podwójne dołączenie bibliotek nie gwarantuje sukcesu.
Podaj przykład.
Przykład radykalnie uproszczony:
Główny moduł:
int main() {
foo();
return 0;
}
W bibliotece libA.a:
void baz() {
puts("Ha!\n");
}
W bibliotece libB.a:
void bar() {
baz();
}
W bibliotece libC.a:
void foo() {
bar();
}
I Makefile:
LIBS=-lA -lB -lC
main: main.o
$(CC) -o $@ $^ $(LIBS)
Nie zbuduje się. Dodanie drugi raz $(LIBS) w wywołaniu linkera nie pomoże.
Przeorganizowanie listy bibliotek owszem.
Paweł
--
(___) | Pawel Wiecek ----------------- Coven / Svart --------------------- |
< o o > |
http://www.coven.vmh.net/ <coven@vmh.net> GSM: +48603240006 |
\ ^ / | GPG/PGP info in message headers * [ Debian GNU/Linux developer ] |
(") |Passionate hatred can give meaning and purpose to an empty life. -EH|