Atmel Studio Library einbinden

OP #4442597
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 */
OP #4445437
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.
Persönliche Seite #4445457
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.
Gast #4445471
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)
Persönliche Seite #4445492
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.