undefined reference to



  • Wieso bekomme ich folgender Fehler ?

    undefined reference to `twi_writeTo(unsigned char, unsigned char*, unsigned char, unsigned char, unsigned char)'
    
    #include <Wire.h>
    
    #include <utility/twi.h>
    
    #include <HardwareSerial.h>
    
    unsigned char i2cAddress = 0x48;
    
    static void writeRegister2(uint16_t value) {
    	unsigned char buffer[3];
    	buffer[0] = 1;
    	buffer[1] = value >> 8;
    	buffer[2] = value & 0xFF;
    	twi_writeTo(i2cAddress, buffer, 3, 1, true);
    }
    
    static void writeRegister(uint16_t value) {
    	Wire.beginTransmission(i2cAddress);
    	Wire.write(01);
    	Wire.write((uint8_t) (value >> 8));
    	Wire.write((uint8_t) (value & 0xFF));
    	Wire.endTransmission();
    }
    

    twi_writeTo findet der Compiler, aber wieso motzt er ?
    Wen es es nicht finden würde, würde folgender Fehler kommen:

    was not declared in this scope
    

    twi.h ist im Ordner utility, welcher sich am gleichen Ort befindet wie Wire.h

    Komischerweise werden aber die Wire.??? Befehle anstandslos kompiliert.
    Die twi Befehle werden auch inerhalb von Wire.cpp aufgerufen, ab dort gehen sie.

    Weis jemand einen Rat.

    Übrigens handelt es sich um ein Arduino Scetch.


  • Mod

    Das ist ein Linkerfehler, der Compiler findet deinen Code in Ordnung. Du musst die Bibliothek, in der die Funktion zur Verfügung gestellt wird, beim Linken mit hinzufügen. Eine Headerdatei ist keine Bibliothek! Das steht nur drin, wie die Funktion aussieht, damit der Compiler passenden Aufrufcode erzeugen kann und die Richtigkeit deines Programms prüfen kann. Daher beschwert sich hier auch der Compiler nicht (er hat schließlich alles, was er braucht), sondern der Linker, der dann wirklich den Maschinencode der Funktion ins Programm einfügen möchte und diesen nicht finden kann.



  • Mathuas schrieb:

    twi_writeTo findet der Compiler

    Auch der Linker? Hört sich nach dem Linker an - heißt, er findet das Symbol nicht und zeigt das auch an.



  • Die cpp-Datei befindet sich im gleichen Order wie die h-Datei.
    Wieso findet dann der Compiler die Daten und der Linker nicht ?



  • Der Compiler findet nur h-Datei, weil du es ihm mit dem #include mitgeteilt hast.

    Das er die cpp-Datei auch übersetzen soll, musst du ihm auch noch sagen.

    Bzw. musst du alle nötigen cpp-Dateien und Bibliotheken zum Projekt/makefile hinzufügen.



  • Bzw. musst du alle nötigen cpp-Dateien und Bibliotheken zum Projekt/makefile hinzufügen.

    Wen ich die makefile angucke, ist dort ein Pfad auf utility vorhanden.

    ...
    # All of the sources participating in the build are defined here
    -include sources.mk
    -include subdir.mk
    -include libraries/Wire/src/utility/subdir.mk
    -include libraries/Wire/src/subdir.mk
    -include libraries/Adafruit_ADS1X15/subdir.mk
    -include core/core/subdir.mk
    -include objects.mk
    ...
    

    Innerhalb der mk-Datei hat es ein Pfad auf die twi.c

    C_SRCS += \
    /home/tux/Programme/sloeber/arduinoPlugin/packages/arduino/hardware/avr/1.6.11/libraries/Wire/src/utility/twi.c
    


  • twi.c?
    Enthält twi.h denn ein extern "C" ?



  • Wieso erkennt der Compiler die Zusammenhänge, und der Linker ist zu doof dazu.
    Laufen die beiden etwa nicht synchron ?



  • Du hast jetzt irgendwie kein wirkliches Interesse, dieses Problem zu lösen, oder?



  • Mathuas schrieb:

    Wieso erkennt der Compiler die Zusammenhänge, und der Linker ist zu doof dazu.
    Laufen die beiden etwa nicht synchron ?

    Das sind zwei getrennte Programme.

    Jede cpp-Datei wird für sich getrennt compiliert.
    Die Informationen über anderen Code befindet sich in den Header (.h) Dateien.
    Da diese mit #include eingebunden werden, sind sie quasi Teil von der cpp-Datei.

    Am Ende müssen noch alle übersetzten Dateien zu einem ausführbaren Programm gebunden werden.
    Das macht der Linker.
    Dafür muss er aber wissen, welche Dateien das sind.


Anmelden zum Antworten