Forum: Mikrocontroller und Digitale Elektronik Atmel Studio Library einbinden


von Benjamin M. (berkutta)


Lesenswert?

Hallo,

Habe aktuell ein mega komisches Phänomen. Wird wohl vorallem an mir 
liegen, dass ich (wiedermal) etwas falsch mache.

Ich möchte eigene Lib's im Atmel Studio (Version 7) einbinden. Dazu bin 
ich wie folgt vorgeganggen:
-Im Projektordner (eine Ebene tiefer als das Atmel .atsln file) habe ich 
einen Ordner "lib" angelegt.
-In diesem habe ich mein .c und .h file abgelegt
-Den Ordner im studio in die Includes aufgenommen (C + C++).
-Den Ordner im Solution Explorer hinzugefügt.

Leider denkt jedoch Atmel Studio, dass irgendwas nicht stimmt. Ich 
bekomme diese zwei Fehler:
Error  2  ld returned 1 exit status collect2.exe  0  0  test_lib_2
Error  1  undefined reference to `out(int)' 
Z:\test_lib_2\test_lib_2\Debug/.././test_lib_2.cpp  18  1  test_lib_2

Hier die test Files die ich verwendet habe:

test_lib_2.c
1
#include <avr/io.h>
2
#include "lib/test.h"
3
4
5
int main(void)
6
{
7
    while(1)
8
    {
9
        out(0xFF);
10
    }
11
}

lib/test.c
1
#include "test.h"
2
#include <avr/io.h>
3
4
void out(int data)
5
{
6
  PORTD = data;
7
}

lib/test.h
1
#ifndef TEST_LIB_H
2
#define TEST_LIB_H
3
4
void out(int data);
5
6
#endif /* TEST_LIB_H */

von Benjamin M. (berkutta)


Lesenswert?

Hallo,

Hat mir da niemand einen Hinweis auf mein Problem? Finde den Fehler 
leider wirklich nicht obwohl ich bereits alle Einstellungen die mir 
dafür bekannt sind mit einem anderen funktionierenden Projekt 
abgeglichen habe und den Fehler gegoogelt habe.

von Christian (Gast)


Lesenswert?

Du musst die bibliothek hinzulinken.
Hast du überhaupt deine lib als lib projekt erstelllt?
Wenn ja, dann musst den den lib pfad deinem projekt hinzufügen und dann 
die lib linken.

von Benjamin M. (berkutta)


Lesenswert?

Hallo,

Danke für deine Antwort. Habe ein "normales" Atmel executable Projekt 
ezeugt. Den Pfad zur Library dann im Solution Explorer + als Directory 
im Compiler hinzugefügt. Hat auch früher mal geklappt wenn ich mich 
recht entsinne, ist jedoch schon ein bisschen her, daher gut möglich das 
ich da etwas komplett verkehrt mache.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Benjamin M. schrieb:
> Ich möchte eigene Lib's im Atmel Studio (Version 7) einbinden. Dazu bin
> ich wie folgt vorgeganggen:
> -Im Projektordner (eine Ebene tiefer als das Atmel .atsln file) habe ich
> einen Ordner "lib" angelegt.
> -In diesem habe ich mein .c und .h file abgelegt

Da ist keine Library im Spiel.

Du solltest C-Quelltext und Libraries auseinanderhalten.

Da Du beim Einbinden der Headerdatei einen relativen Pfad angibst, musst 
Du Dein sogenanntes "library"-Verzeichnis nicht in den Compiler- bzw. 
Projekteinstellungen angeben. Das ist nur dann nötig, wenn Du keinen 
relativen Pfad verwendest.

> Error  1  undefined reference to `out(int)'
> Z:\test_lib_2\test_lib_2\Debug/.././test_lib_2.cpp  18  1  test_lib_2

Diese Fehlermeldung bekommst Du, weil Du die *.c-Datei in Deinem 
sogenannten "Library"-Verzeichnis nicht zum Projekt hinzugefügt hast, 
und obendrein, weil Du C- und C++-Code mischst.

Damit Du aus C++-Code heraus C-Funktionen verwenden kannst, musst Du 
deren Deklarationen im "C"-Namensraum unterbringen, sonst versucht der 
Compiler eine entsprechend benannte C++-Funktion aufzurufen, die wegen 
des "name mangling" auf Linkerebene aber einen völlig anderen Namen 
erhält als die C-Funktion.


Lass' das mit dem Mischen von C++- und C-Code erstmal einfach sein, 
verwende nur *.c.

von Benjamin M. (berkutta)


Lesenswert?

Yay, cool. Danke, das war das Problem :)
Hatte effektiv jeweils ein C++ Projekt angelegt, anstatt wie eigentlich 
sinnvoll C.

von Christian (Gast)


Lesenswert?

Wenn du eine eigene Lib machen willst dann erstelle ein "Static Library 
Project". Die so erstellte Lib (endung .a) kannst du dann in anderen 
Projekten verwenden, wie schon rufus erwähnt hat pass auf auf beim 
mischen von C und C++ code.

@rufus Die Include-pfade braucht er nicht hinzufügen wenn er relative 
Pfade beim inkludieren verwendet, aber den Librarypath braucht der 
Linker sehr wohl. (Wenn er tatsächlich eine Library verwenden würde)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Christian schrieb:
> Wenn er tatsächlich eine Library verwenden würde

Selbst dann nicht unbedingt, wenn er die Library inklusive Pfad zum 
Projekt hinzufügen würde (und der verwendete Linker dies unterstützt).

Aber das ist ja eher akademisch, weil es hier gar nicht um Libraries 
ging, sondern nur um das verbreitete Missverständnis, es handele sich 
um eine Library, nur weil *.c/*.h zusammen auftreten und das ganze 
irgendeine Funktion hat.

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.