Forum: Mikrocontroller und Digitale Elektronik g++ Makefile Raspberry PI


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Peter (Gast)


Angehängte Dateien:

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

von Sven B. (scummos)


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

von Peter (Gast)


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!

von Anonymous (Gast)


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)

von Peter (Gast)


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!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.