• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Programowanie w edytorze tekstowym, linux, konsola

Object Storage Arubacloud
+2 głosów
484 wizyt
pytanie zadane 27 października 2019 w C i C++ przez Tomcio2000 Użytkownik (900 p.)

Otóż chciałbym się dowiedzieć, dlaczego postępując wg instrukcji mój program nie wczytuje polecenia. Program piszemy w edytorze tekstowym w linux mint/ubuntu. Kompilujemy i pozostałe wszystkie rzeczy robimy w konsoli linuksowej.

To jest ta instrukcja.

  1. Napisz najprostszy program, skompiluj go i uruchom:

prog1.cpp:

int main() {
   return 0;
}

g++ prog1.cpp

./a.out

  1. Uruchom manualnie kolejne etapy kompilacji:
  • sprawdź wersję kompilatora: g++ --version
g++ (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
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.

w tym przypadku wersja kompilatora to 4.8.4 - ta informacja będzie potrzebna później.

  • uruchom preprocesor: g++ -E prog1.cpp -o prog1.preprocessed
  • obejrzyj wynik działania preprocesora: cat prog1.preprocessed
  • uruchom kompilator, nie asembluj: g++ -S prog1.cpp -o prog1.compiled
  • obejrzyj wynik: cat prog1.compiled
  • uruchom kompilator + asembler: g++ -c prog1.cpp -o prog1.compiled-assembled
  • obejrzyj wynik: cat prog1.compiled-assembled
  • lepszy sposób badania pliku objektów - wylistuj symbole : nm prog1.compiled-assembled
  • aby stworzyć ostateczny plik wykonywalny - uruchom linker - uwaga, ścieżki są poprawne dla wersji gcc 4.8.4: ld -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o prog1 /usr/lib/x86_64-linux-gnu/crt1.o /usr/lib/x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.8.4/crtbegin.o prog1.compiled-assembled -L/usr/lib/gcc/x86_64-linux-gnu/4.8.4 -lstdc++ -lc /usr/lib/gcc/x86_64-linux-gnu/4.8.4/crtend.o /usr/lib/x86_64-linux-gnu/crtn.o
  • dla systemów 32-bitowych uruchomienie linkera będzie miało postać: ld -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o prog1 /usr/lib/x86_64-linux-gnu/crt1.o /usr/lib/x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.8.4/crtbegin.o prog1.compiled-assembled -L/usr/lib/gcc/x86_64-linux-gnu/4.8.4 -lstdc++ -lc /usr/lib/gcc/x86_64-linux-gnu/4.8.4/crtend.o /usr/lib/x86_64-linux-gnu/crtn.o
  • po poprawnym zlinkowaniu program powinien uruchomić się w ten sam sposób jak skompilowany na samym początku program a.out

Wyskakują mi takie komunikaty

komentarz 27 października 2019 przez Tomcio2000 Użytkownik (900 p.)

Jeszcze jedno pytanie w jaki sposób mam zrobić te zadania ?

  1. Napisz program, który będzie składał się z 3 plików:
  • main.cpp
  • funkcje.cpp
  • funkcje.h

Program main powinien korzystać z funkcji int dodaj(int,int) definiowanej w pliku źródłowym funkcje.cpp. Skompiluj pliki main.cpp i funkcje.cpp osobno, niezależnie od siebie:

  • g++ -c main.cpp -o main.o,
  • g++ -c funkcje.cpp -o funkcje.o

Wykonaj polecenie nm funkcje.o oraz nm main.o aby sprawdzić jakie symbole eskportowane są przez poszczególne pliki .o.

Wykonaj operację linkowania obiektów main.o i funkcje.o

Tzn do linkowania jest wszystko ok, ale już linkowanie pokazuje, że nie ma takiego pliku/katalogu.

1 odpowiedź

+1 głos
odpowiedź 27 października 2019 przez adrian17 Ekspert (344,860 p.)
wybrane 4 listopada 2019 przez Tomcio2000
 
Najlepsza

Trochę mała rozdzielczość, ale na oko... To nie jest `ld-dynamic-linker`, tylko `ld` z flagami.

Poza tym:

aby stworzyć ostateczny plik wykonywalny - uruchom linker - uwaga, ścieżki są poprawne dla wersji gcc 4.8.4

Nawet jak poprawisz literówki, to ścieżki nie byłyby poprawne na nowszym systemie :P

Ogólnie to się wydaje przekombinowaną instrukcją - prościej odpalić g++ do zlinkowania tego pliku prog1.compiled-assembled (który pod spodem odpali ld za Ciebie).

Tzn do linkowania jest wszystko ok, ale już linkowanie pokazuje, że nie ma takiego pliku/katalogu.

Tak samo - prościej zlinkować g++em :P Po prostu `g++ main.o funkcje.o`. Jak nauczyciel bardzo bardzo chce widzieć że wykonałeś komendę ld, to zawsze można pójść na skróty, poprosić g++a o informację co zrobił i przekopiować na żywca komendę którą g++ użył do wywołania ld (bo sam bym jej w życiu nie wywnioskował).

Patrz: https://asciinema.org/a/vwjIBrwhDmpz6hfBabB24ADhs
Wyciąganie ld: https://asciinema.org/a/2FCGUdsenkQQEAj7aEnBpi0uP

komentarz 4 listopada 2019 przez Tomcio2000 Użytkownik (900 p.)
Okazało się, że nie wiedziałem, że trzeba dać spację ld -dynamic-linker i wszystko okej.
Ciekawy i szybki sposób linkowania
Dziękuję za pomoc, daje NAJ !
komentarz 4 listopada 2019 przez adrian17 Ekspert (344,860 p.)

Ciekawy i szybki sposób linkowania

Nie "ciekawy" tylko to ten szybki sposób jest powszechny i normalny :P To `ld` jest tutaj ciekawostką - nikt (chyba że robisz embedded lub coś niezwykle niestandardowego) nie pisze z ręki `ld`, tylko po prostu używa kompilatora.

Podobne pytania

0 głosów
4 odpowiedzi 221 wizyt
pytanie zadane 20 maja 2016 w C i C++ przez Koko$ Użytkownik (740 p.)
0 głosów
1 odpowiedź 1,161 wizyt
pytanie zadane 4 grudnia 2018 w Systemy operacyjne, programy przez Micheall Początkujący (420 p.)
0 głosów
3 odpowiedzi 1,578 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...