collect2: error: ld returned 1 exit status {megoldva}

 ( bzs | 2017. január 15., vasárnap - 13:43 )

Sziasztok.

Egy mezei programot szeretnék leforgatni, a neve rtl-ais.
Ezen instrukciókat követtem Ubuntu studion és Arch-on (ez utóbbi rpi zeron van):
https://github.com/dgiardini/rtl-ais/blob/master/README
Nem ment.
A forgatás.
Ezt kaptam:


root@fekete:/usr/src/rtl-ais/rtl-ais# make
cc main.o rtl_ais.o convenience.o ./aisdecoder/aisdecoder.o ./aisdecoder/sounddecoder.o ./aisdecoder/lib/receiver.o ./aisdecoder/lib/protodec.o ./aisdecoder/lib/hmalloc.o ./aisdecoder/lib/filter.o ./tcp_listener/tcp_listener.o -o rtl_ais -lpthread -lm -L/usr/local/lib -lrtlsdr -lusb-1.0 
./aisdecoder/lib/filter.o: In function `__mac_g':
/usr/src/rtl-ais/rtl-ais/aisdecoder/lib/filter-i386.h:37: multiple definition of `__mac_g'
./aisdecoder/lib/receiver.o:/usr/src/rtl-ais/rtl-ais/aisdecoder/lib/filter-i386.h:37: first defined here
./aisdecoder/lib/filter.o: In function `__mac_c':
/usr/src/rtl-ais/rtl-ais/aisdecoder/lib/filter-i386.h:48: multiple definition of `__mac_c'
./aisdecoder/lib/receiver.o:/usr/src/rtl-ais/rtl-ais/aisdecoder/lib/filter-i386.h:48: first defined here
collect2: error: ld returned 1 exit status
Makefile:56: recipe for target 'rtl_ais' failed
make: *** [rtl_ais] Error 1


Próbáltam rákeresni a tárgyban megadott hibaüzenetre, de sajnos ennyire nem értek a céhez, csak 1 évig tanultam vala kb. 12 éve.

Szeretném először az ubuntumon leforgatni, majd arch-on is, az Arch-on egyes *dev csomagokat meg sem tudok szerezni hozzá, mert a repóim hiányosak vagy meghibbantak. Szóval tanácstalan vagyok.

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Szia.

Ezeket telepítsd fel előtte.
- librtlsdr
- libusb
- libpthread

Mind fönt van, a dev csomahok is. Ez volt az első, amit néztem.
Emiatt nem értem.

---
--- A gond akkor van, ha látszólag minden működik. ---
---

Milyen rendszeren próbálod lefordítani? 64bit?

32

Az üzenet alapján úgy tűnik, valahol duplán van include-olva a filter-i386.h header file.

Védd le a dupla include ellen a header file-t! Kezdődjön ezen sorokkal:
#ifndef __FILTER_I386_H
#define __FILTER_I386_H
illetve a végére tégy egy
#endif
sort. Aztán lássuk! ;-)

Mivel nem tudom, miről beszélsz, a rtl_ais.h fájl elejére beírtam amit írtál. Semmi változás. Próbáltam hasonló nevű .h fájlra keseni ami duplikálva van, semmire sem jutottam, mert nem értem.

---
--- A gond akkor van, ha látszólag minden működik. ---
---

Az arch-on sikerült megtalálni, mi hiányzott a belének.
Ez:

pacman -S core/libusb

Debianon még a hóhérom sem tudja, mi a hiányosság.
Oda is felrámoltam ezeket:

root@fekete:/usr/src# apt-get install libusb-1.0-0 libusb-1.0-0-dev
Csomaglisták olvasása... Kész
Függőségi fa építése
Állapotinformációk olvasása... Kész
libusb-1.0-0 már a legújabb verzió.
libusb-1.0-0-dev már a legújabb verzió.
0 frissített, 0 újonnan telepített, 0 eltávolítandó és 0 nem frissített.

... mégsem fordul

---
--- A gond akkor van, ha látszólag minden működik. ---
---

Úgy látom libusb-ből 2 verzió is van a repóban, 1.0 és 0.1.4 - nézd meg melyik kellhet.

Már néztem korábban...
# apt-get install libusb-0.1-4
Csomaglisták olvasása... Kész
Függőségi fa építése
Állapotinformációk olvasása... Kész
libusb-0.1-4 már a legújabb verzió.
0 frissített, 0 újonnan telepített, 0 eltávolítandó és 0 nem frissített.

Azt is próbáltam, mi van, ha csak külön-külön van fenn a kétféle verzió.

---
--- A gond akkor van, ha látszólag minden működik. ---
---

És a dev csomagjaik? Próbáld ki mindkét dev-vel külön külön telepítve a fordítást.

Néztem azokat is, csak már elfáradtam tőle.

---
--- A gond akkor van, ha látszólag minden működik. ---
---

Milyen fordítóverzióval? Nekem fordult Debian8/amd64-en az alábbiakkal:

gcc (Debian 4.9.2-10) 4.9.2
GNU ld (GNU Binutils for Debian) 2.25

Ilyesmit lehetne kipróbálni:

sed -i.bak 's/extern inline/static inline/' aisdecoder/lib/filter-i386.h

Szerk: Sikerült? Nem sikerült? Nem érted? Nincs sed(1) a gépeden? Egyéb?

Sikerült!!!!!

Köszönöm.
Most az értelmét keresem, mi a külső és a statikus inline közti különbség, bár mivel már megoldódott a forgatás, már az új lépéssel foglalkozom.

Kösz mindenkinek a türelmet.

---
--- A gond akkor van, ha látszólag minden működik. ---
---

Örülök, hogy sikerült; de hogy mi értelme annak, hogy az inline-t még kombináljuk valami más tárolási osztállyal, arról fogalmam sincs... Egyébként is van pár warning a fordításban, de remélem azért működik.

Raspberry Zeron, Arch Linuxon természetesen nem fordul le:

CMake Error at CMakeLists.txt:54 (MESSAGE):
The development files for ALSA or PulseAudio are required - libasound-dev,
libpulse-dev

...és persze a pacman repói ezen dev csomagokat sem tartalmazzák.

---
--- A gond akkor van, ha látszólag minden működik. ---
---

Ez még mindig a rtl-ais? Mert abban nem véltem cmake-et látni...

Nem az, az aisdecoder.
De megtaláltam mi hiányzik, a pacman repóiban nincs -dev csomag, a binárisokban ott vannak a headerek. Ez kellett:

# ls -l ./*.tar.xz
-rw-rw-r-- 1 root root 377836 Jan 23 16:00 ./alsa-lib-1.1.0-1-armv6h.pkg.tar.xz
-rw-rw-r-- 1 root root 945816 Jan 23 16:00 ./alsa-utils-1.1.0-1-armv6h.pkg.tar.xz

és itt találtam rájuk, mert a pacmanom sok egyéb dekódert is fel akart nekem pakolni:

http://fraggod.net/static/mirror/packages/archlinuxarm/armv6h/

---
--- A gond akkor van, ha látszólag minden működik. ---
---

Ezzel Debianon is lefordult.

Nézz bele ebbe a fájlba: https://github.com/dgiardini/rtl-ais/blob/master/Makefile

A következő sorok gyanúsak:
RTLSDR_INCLUDE=/tmp/rtl-sdr/include
RTLSDR_LIB=/tmp/rtl-sdr/build/src
LIBUSB_INCLUDE=/tmp/libusb/include/libusb-1.0
LIBUSB_LIB=/tmp/libusb/lib

Szerintem javítsd ki ezeket...

--

nTOMasz
"The hardest thing in this world is to live in it!"

Reszletek mellozesevel most csak annyi, hogy vedd ki a filter.h fajlbol, azt a sort, ahol a filter-i386.h kerul include-ra, vagy kommenteld ki (elveszik egy kis optimalizacio, de le fog fordulni ujabb gcc-kel is).
make clean
make

es mar meg is van.