Forum: Compiler & IDEs ARM Keil uVision .lib einbinden


von analogon (Gast)


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)


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)


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)


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)


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)


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)


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)


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)


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)


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.

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.