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
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
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!
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)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.