g++ Makefile Raspberry PI

Gast #3070888
Lesenswert?

Hi,

versuche gerade ein Makefile ans laufen zu bekommen. Platform ist dabei 
ein Raspberry PI mit Debian.

Das folgende funktioniert tadellos, wenn ich es direkt eingebe.
g++ -o spi -l rt LIB/MCP23S17/mcp23s17.cpp LIB/SPI/spi.cpp 
LIB/HEIZUNG/heizung_rev05.cpp LIB/AD420/ad420.cpp main.cpp -l bcm2835 
-std=c++0x

Ist aber eine etwas unschöne Lösung, da sämtliche Dateien neu gebaut 
werden. Der Einsatz eines Makefiles will mir jedoch nicht ganz gelingen. 
Ich verwende dafür das File im Anhang. Dabei bricht der allerings mit 
der foldenden Ausgabe ab. Meine Suche hat ergeben, das der g++ scheinbar 
nicht gegen die libstd++ linkt. Weiß allerdings nicht, wie ich das 
beheben soll. Weiß das wer weiter?

g++ -Wall -g -D_REENTRANT -std=c++0x -nostartfiles -v -o ./program 
build/LIB/AD420/ad420.o  build/LIB/HEIZUNG/heizung_rev05.o 
build/LIB/MCP23S17/mcp23s17.o  build/LIB/SPI/spi.o -lrt -lbcm2835
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/4.6/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: ../src/configure -v --with-pkgversion='Debian 
4.6.3-14+rpi1' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs 
--enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr 
--program-suffix=-4.6 --enable-shared --enable-linker-build-id 
--with-system-zlib --libexecdir=/usr/lib --without-included-gettext 
--enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 
--libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu 
--enable-libstdcxx-debug --enable-libstdcxx-time=yes 
--enable-gnu-unique-object --enable-plugin --enable-objc-gc 
--disable-sjlj-exceptions --with-arch=armv6 --with-fpu=vfp 
--with-float=hard --enable-checking=release --build=arm-linux-gnueabihf 
--host=arm-linux-gnueabihf --target=arm-linux-gnueabihf
Thread model: posix
gcc version 4.6.3 (Debian 4.6.3-14+rpi1)
COMPILER_PATH=/usr/lib/gcc/arm-linux-gnueabihf/4.6/:/usr/lib/gcc/arm-lin 
ux-gnueabihf/4.6/:/usr/lib/gcc/arm-linux-gnueabihf/:/usr/lib/gcc/arm-lin 
ux-gnueabihf/4.6/:/usr/lib/gcc/arm-linux-gnueabihf/
LIBRARY_PATH=/usr/lib/gcc/arm-linux-gnueabihf/4.6/:/usr/lib/gcc/arm-linu 
x-gnueabihf/4.6/../../../arm-linux-gnueabihf/:/usr/lib/gcc/arm-linux-gnu 
eabihf/4.6/../../../:/lib/arm-linux-gnueabihf/:/lib/:/usr/lib/arm-linux- 
gnueabihf/:/usr/lib/
COLLECT_GCC_OPTIONS='-Wall' '-g' '-D' '_REENTRANT' '-std=c++0x' 
'-nostartfiles' '-v' '-o' './program' '-shared-libgcc' '-march=armv6' 
'-mfloat-abi=hard' '-mfpu=vfp'
 /usr/lib/gcc/arm-linux-gnueabihf/4.6/collect2 --sysroot=/ --build-id 
--no-add-needed --eh-frame-hdr -dynamic-linker /lib/ld-linux-armhf.so.3 
-X --hash-style=both -m armelf_linux_eabi -o ./program 
-L/usr/lib/gcc/arm-linux-gnueabihf/4.6 
-L/usr/lib/gcc/arm-linux-gnueabihf/4.6/../../../arm-linux-gnueabihf 
-L/usr/lib/gcc/arm-linux-gnueabihf/4.6/../../.. 
-L/lib/arm-linux-gnueabihf -L/usr/lib/arm-linux-gnueabihf 
build/LIB/AD420/ad420.o build/LIB/HEIZUNG/heizung_rev05.o 
build/LIB/MCP23S17/mcp23s17.o build/LIB/SPI/spi.o -lrt -lbcm2835 
-lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc
/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 
00008fe0
build/LIB/AD420/ad420.o: In function 
`__static_initialization_and_destruction_0':
/home/pi/Programmieren/INSPEKT/LIB/AD420/ad420.cpp:51: undefined 
reference to `__dso_handle'
build/LIB/HEIZUNG/heizung_rev05.o: In function 
`__static_initialization_and_destruction_0':
/home/pi/Programmieren/INSPEKT/LIB/HEIZUNG/heizung_rev05.cpp:295: 
undefined reference to `__dso_handle'
build/LIB/MCP23S17/mcp23s17.o: In function 
`__static_initialization_and_destruction_0':
/home/pi/Programmieren/INSPEKT/LIB/MCP23S17/mcp23s17.cpp:344: undefined 
reference to `__dso_handle'
collect2: ld returned 1 exit status
make: *** [program] Error 1
Angehängte Dateien:
#3070915
Lesenswert?

Hey,

schau mal hier, ich schätze, das sollte auch das Problem bei dir sein: 
http://stackoverflow.com/questions/6704780/using-only-g-works-but-not-g-c-and-ld

Abgesehen davon ist die Lösung ziemlich over-engineered, wenn du mich 
fragst ;)
Hast du mal daran gedacht, entweder ein extrem einfaches Makefile zu 
schreiben oder, wenn's toll sein soll, einen Makefile-Generator wie 
cmake zu verwenden?
In cmake wäre das relativ einfach (nicht getestet):
1
project(spi)
2
add_executable(spi datei1.cpp datei2.cpp)
3
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++0x")
4
target_link_libraries(spi rt bcm2835)

Das ist dann schön bunt und leicht zu warten. ;)

Grüße,
Sven
Gast #3071768
Lesenswert?

Auf die Seite bin ich ebenfalls gestoßen, jedoch konnte und kann ich 
damit leider nicht viel anfangen. Ich habe im Makefile zusätzlich 
angegeben, das die lib libstdc++ benutzt werden soll, allerdings bricht 
er mit der selben Fehlermeldung ab. Rufe ich ld manuell auf, ebenfalls 
die gleiche Ausgabe.

CMake funktionierte auf Anhieb. Ist definitiv der einfachere und 
elegantere Weg. Würde allerdings gerne das Problem was sich mit meinem 
eigenen Makefile ergibt, verstehen. Bin für jede Anregung dankbar!
Gast #3071800
Lesenswert?

Du hast im Makefile Optionen, die du im normalen Aufruf nicht nutzt:
-v -nostartfiles
wobei -v die Ausgabe ganz schön aufbläht, und -nostartfiles womöglich 
dein Problem beim Linken ist. Ansonsten kannst du dir ja auch mal die 
Parameter anschauen, die CMake für den Linkeraufruf nutzt ("make 
VERBOSE=yes" glaub ich war das)
Gast #3071950
Lesenswert?

Ah, habe es endlich gefunden. Meine main.cpp wurde durch make nicht 
erfasst, infolgedessen hatte der Linker ein Problem. Durch das 
-nostartfiles wurde das allerdings verdeckt. Jetzt läuft es einwandfrei. 
Werde dennoch bei cmake bleiben. Danke für eure Hilfe!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren