ARM Keil uVision .lib einbinden

Gast #5637493
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.
Gast #5637499
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"?
Gast #5637508
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
Gast #5637514
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.
Gast #5637556
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?
Gast #5637557
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.
#5637927
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.
Gast #5638005
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren