c++ static library in c programm
-
hi
ich versuche eine c++ static library zu schreiben und die dann in einem c programm zu nutzen, ohne erfolg. kann mir villeicht jemand erklären wie ich das machen kann, und wo extern "C" hin muss und so?
wäre echt super.gruß
barfoo
-
mit extern "C" schaltet man nur das name mangling ab, damit eine bibliothek auch mit c verwendet werden kann (zumindest halt der teil, der kompatibel zu c ist). eine statisch bibliothek unterschied sich im endeffekt nur durch zwei dinge:
- der code darf nicht PIC compiliert sein.
- du fügst alles mit ar statt ld zu einem archive zusammen.g++ -c module1.cpp
g++ -c module2.cpp
ar rcu libxy.a module1.o module2.o
-
hi, vielen dank für deine antwort.
also erstellen lässt sich die lib ohne probleme, die tauchen allerdings bei der benutzung dann auf.
ich hab in der lib.h vor den funktionen ein extern "C" gemacht.wenn ich die lib nun benutzen will mit gcc -o foo main.c -L. -lmylib sagt er:
lic.h error: syntax error before string constant
damit meint er das extern "C" in der header.
was mache ich falsch?
-
#ifdef __cplusplus extern "C" { #endif /* Hier alle Deklarationen */ #ifdef __cplusplus } /* Ende extern "C" */ #endif
Wenn Du die C++-Bibliothek in C benutzt, muss extern "C" natürlich ausgeblendet werden, da diese Syntax in C nicht existiert. Dafür nimmt man üblicherweise ein Konstrukt wie das obige. (Zuvorkommende Programmierer machen das sogar in C-Bibliotheken)
-
Ja, der C Compiler versteht auch kein
extern "C"
- da mußt du dafür sorgen, daß er es nicht zu Gesicht bekommt:#ifdef __cplusplus extern "C" { #endif //deine Funktions-Prototypen #ifdef __cplusplus } #endif
-
hi, vielen dank für eure antworten. klingt ja auch irgendwie logisch, dass der c-compiler extern "C" micht kennt
wieder was gelernt.aber irgendwie funzt das immer noch nicht.
ich hab also die lib wie oben gesagt erstellt. in der lic.h habe ich die defines drin. in der lic.cpp nicht.(?)
hab ne kleine testmain geschrieben um die funktionen zu nutzen. in der main habe ich die lic.h inkludiert. und benutze die funktionen dann einfach.
die headers der lib sind auch im main-verzeichnis.
kompiliert habe ich das mit: gcc -L. -lmylib main.c -o foo
jetzt bekomm ich linker fehler:
main.c:(...): undefined reference to 'getAuth'
und das gleiche nochmal für die andere funktion aus der lib.was mach ich nun wieder falsch?
gruß
-
barfoo schrieb:
was mach ich nun wieder falsch?
barfoo schrieb:
in der lic.h habe ich die defines drin. in der lic.cpp nicht.(?)
Aber extern "C" (ohne die defines) hast Du auch im cpp drin?
Im Zweifel zeig nochmal alle Dateien mit dem jetzigen Stand.
-
ne in der lic.cpp habe ich keine defines und auch kein extern "C". muss das da auch rein?
-
Das extern "C" ja - woher soll der Compiler sonst wissen, dass Du gerade die Funktionen definieren möchtest, die Du zuvor extern "C" deklariert hast. In C++ gibt es Funktionsüberladung, d.h. unterschiedliche Funktionen mit gleichem Namen!
-
ok, hab in der lic.cpp vor den funktionen nochn extern "C" geschrieben.
der gleiche fehler
-
Raten macht keinen Spaß:
LordJaxom schrieb:
Im Zweifel zeig nochmal alle Dateien mit dem jetzigen Stand.
...und die Compileraufrufe
-
sorry
also ich benutze in meiner library auch die tomcrypt library. dazu habe ich alle objektdateien und headerdateien von der tomcrypt und tommath in einem verzeichnis gepackt.
dazu habe ich dann noch meine funktionen gepackt, bestehend aus einer lic.h, lic.cpp, Socket.h, Socket.cpp.lic.h (alle benötigten headerdateien sind in der lic.cpp inkludiert)
#ifdef __cplusplus extern "C" { #endif int getAuth(const char* ip, int port, int id, const char* host); int alive(const char* ip, int port, int id); #ifdef __cplusplus } #endif
lic.cpp
extern "C" int getAuth(const char* ...) { ... } extern "C" int alive(... { ... }
dann hab ich die objektdateien für meine funktionen erstellt:
g++ -DLTM_DESC -c lic.cpp Socket.cpp (LTM_DESC is für die tomcrypt)
und die lib erstellt:
ar rcu libLiC.a *.odie lib und alle benötigten headers in das verzeichnis der main.c kopiert.
main.c#include <stdlib.h> #include <stdio.h> #include "lic.h" int main() { ... error=getAuth(ip, port, id, host); ... error=alive(ip, port, id); return 0; }
die main mit folgendem kompiliert:
gcc -L. -lLiC main.c -o foofehlermeldungen:
main.c...): undefined reference to 'getAuth'
main.c...): undefined reference to 'alive'gruß
-
das "-lLiC" muss hinter das "main.c".
außerdem kannst du in der .ccp-datei das extern "C" weglassen. das muss nur in der header datei stehen.EDIT: irgendwie wäre das mal cool, einen sticky thread zu machen bezüglich undefined references und statische libs. das is jetzt in der kurzen zeit, in der ich hier bin, der dritte fall, dass genau das problem auftaucht.