Forum: Compiler & IDEs ARM Keil uVision .lib einbinden


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 analogon (Gast)


Bewertung
0 lesenswert
nicht lesenswert
hallo zusammen,

ich bin gerade dabei ein neues C-Projekt (Projekt A) in KEIL uVision zu 
erstellen.
Parallel dazu habe ich ein zweites C-Projekt (Projekt B) in KEIL welches 
im Grunde genommen meine library ist. Die .lib Datei wird auch 
Ordnungsgemäß beim kompilieren erzeugt.


Jedoch habe ich Probleme mit dem einbinden der .lib Datei aus Projekt B 
in Projekt A. Ich habe, egal was ich mache, keinen Zugriff auf die 
Funktionen in der .lib.

Dabei halte ich es erstmal ganz Simpel:

in der .h steht:
1
#ifndef __INTERFACE_H
2
#define __INTERFACE_H
3
4
#ifdef __cplusplus
5
  extern "C"{
6
#endif
7
8
9
struct vector{
10
  int size; 
11
  int cap;
12
};
13
14
15
extern int calculate_numbers(int a, int b);
16
17
18
#ifdef __cplusplus
19
  }
20
#endif
21
22
#endif /* __INTERFACE_H */

in der .c:
1
#include "interface.h"
2
3
4
5
int calculate_numbers(int a, int b){
6
  
7
  
8
  return a+b;
9
}
Ich habe auch berücksichtigt, dass beim einbinden der .lib File in 
Projekt-A das object-file (in diesem Fall die interface.o) auszuwählen 
ist.

Jedoch habe ich beim einbinden in meinem Hauptprojekt, keine Chance 
einen Zugriff auf meine Funktionen zu bekommen.

Was mache ich falsch ?
Leider finde ich zum thema .lib und uVision wenig informationen.

von Dr. Sommer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
analogon schrieb:
> #ifndef __INTERFACE_H
> #define __INTERFACE_H

Bezeichner die mit doppeltem Unterstrich, oder Unterstrich+Großbuchstabe 
anfangen, sind verboten.

analogon schrieb:
> extern int calculate_numbers(int a, int b);

Das "extern" hat an Funktionen absolut keine Wirkung und ist 
überflüssig.

analogon schrieb:
> Ich habe auch berücksichtigt, dass beim einbinden der .lib File in
> Projekt-A das object-file (in diesem Fall die interface.o) auszuwählen
> ist.

Hä? Ich kenne mich mit µVision nicht besonders aus, aber eigentlich 
sollte die .lib das .o enthalten.

analogon schrieb:
> Jedoch habe ich beim einbinden in meinem Hauptprojekt, keine Chance
> einen Zugriff auf meine Funktionen zu bekommen.

Was passiert denn, wenn du ganz frech calculate_numbers(1,2) aufrufst, 
nachdem du die interface.h inkludiert hast? Sagt der Compiler, "Ätsch, 
keine Chance"?

von analogon (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Dr. Sommer schrieb:

> Hä? Ich kenne mich mit µVision nicht besonders aus, aber eigentlich
> sollte die .lib das .o enthalten.
 Tut es ja, jedoch muss bei KEIL nochmal gewählt werden, welche objekte 
verwendet werden sollen.

> analogon schrieb:
>> Jedoch habe ich beim einbinden in meinem Hauptprojekt, keine Chance
>> einen Zugriff auf meine Funktionen zu bekommen.
>
> Was passiert denn, wenn du ganz frech calculate_numbers(1,2) aufrufst,
> nachdem du die interface.h inkludiert hast? Sagt der Compiler, "Ätsch,
> keine Chance"?
Beim einbinden der interface.h bekomme ich ein "No such file or 
directory"


Wird das Einbinden der interface.h weg gelassen, wird der Aufruf der 
calculate_number-Funktion im Projekt-A als implicit declaration 
gedeutet...


viele Grüße

von Dr. Sommer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
analogon schrieb:
> Beim einbinden der interface.h bekomme ich ein "No such file or
> directory"

Dann musst du das Verzeichnis, welches die interface.h enthält, zum 
Inklude-Pfad des Projekt A hinzufügen. Nur die .lib hinzufügen reicht 
nicht.

analogon schrieb:
> Wird das Einbinden der interface.h weg gelassen, wird der Aufruf der
> calculate_number-Funktion im Projekt-A als implicit declaration
> gedeutet...

Normal.

von analogon (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ok da hätte ich auch drauf kommen können.

Ich dachte als, dass es nicht mehr nötig wäre die Files nachträglich zu 
inkludieren :-)



Danke dir !


Beste Grüße

von analogon (Gast)


Bewertung
0 lesenswert
nicht lesenswert
analogon schrieb:
> Ok da hätte ich auch drauf kommen können.
>
> Ich dachte als, dass es nicht mehr nötig wäre die Files nachträglich zu
> inkludieren :-)
>
> Danke dir !
>
> Beste Grüße


Aber dann kann ich doch im Grunde die .lib weg lassen und wie immer mit 
den .h/.c files arbeiten?

Welchen Zusatznutzen bringt mir dann die .lib?

von Dr. Sommer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
analogon schrieb:
> Welchen Zusatznutzen bringt mir dann die .lib?

Dass der Nutzer von Projekt A den Quellcode der Library nicht sehen kann 
(für proprietäre Software) und dass du nicht für jedes Projekt, welches 
die Library nutzt, alle .c Dateien kompilieren musst, was je nach Größe 
der Library länger dauern kann.

von Jan K. (jan_k)


Bewertung
0 lesenswert
nicht lesenswert
Woher wüsstest du ohne Header denn sonst, wie die Funktionen heißen und 
wie sie aufzurufen sind?

Der header soll (oder sollte) alle öffentlich zugänglichen Funktionen 
und ggf. eine kurze Dokumentation enthalten, die zur Benutzung der lib 
benötigt werden. Dem Linker versprichst du damit, dass er diese 
Funktionen irgendwo in den .o files findet.

von analogon (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Jan K. schrieb:
> Woher wüsstest du ohne Header denn sonst, wie die Funktionen
> heißen und wie sie aufzurufen sind?
>
> Der header soll (oder sollte) alle öffentlich zugänglichen Funktionen
> und ggf. eine kurze Dokumentation enthalten, die zur Benutzung der lib
> benötigt werden. Dem Linker versprichst du damit, dass er diese
> Funktionen irgendwo in den .o files findet.

Das sehe ich ja ein.
Aber fehlt das .c file, funktioniert auch das nicht.

Also muss ich nach wie vor die .c und .h inkludieren, bzw dessen Pfad ?


Viele Grüße

von Dr. Sommer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
analogon schrieb:
> Also muss ich nach wie vor die .c und .h inkludieren, bzw dessen Pfad ?

Nein, nur die .h ! Das Kompilat der .c ist in der .lib enthalten.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.