2017-01-23 1 views
0

Hier ist meine beinhaltet:g ++ undefined reference (Linker Parametrisierung nicht das Problem?) Libscrypt_scrypt

#include <iostream> 
#include <string> 
#include <cstring> 
#include <stdio.h> //for snprintf 
#include <libscrypt.h> 
#include <sqlite3.h> 
#include "generator.h" //has no dependencies 

Und hier ist mein g ++ 4.2.1 Befehl mit Kompilierungsfehlern:

# g++ -I/usr/local/include -L /usr/local/lib test.cpp generator.cpp -o test -lscrypt -lsqlite3 
/tmp//cctxmw4C.o: In function `insertUser()': 
test.cpp:(.text+0x607): undefined reference to `libscrypt_salt_gen(unsigned char*, unsigned long)' 
test.cpp:(.text+0x6c3): undefined reference to `libscrypt_scrypt(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long long, unsigned int, unsigned int, unsigned char*, unsigned long)' 
collect2: ld returned 1 exit status 

Ähnliche compiles C-Code gut mit GCC. Ich glaube nicht, dass die Reihenfolge der Parameter das Problem ist - Ich habe mehrere Variationen versucht, einschließlich der Verschiebung der -I, -L und beide -l Flags. Sowohl scrypt als auch sqlite3 sind C-Bibliotheken, und sqlite3 löst keine Fehler aus, obwohl der Header und die gemeinsam genutzte Bibliothek in -I bzw. -L sind.

Antwort

1

Schauen Sie sich die Lösung hier an.

Using C Libraries for C++ Programs

 

    extern "C"{ 
    void c_function_prototype(); 
    } 

oder

 

    extern "C" void c_function_prototype(); 

If you have it see "The C++ Programming Language (Stoustrup) 4th Edition" p429 
+0

Sorry, aber ich einen Kommentar nicht veröffentlichen können (auf der Hauptfrage) noch ... – ccpgh

+0

Oh wow, ich hatte keine Ahnung. Ist das der bevorzugte Weg, um #include mit externem "C" (...) zu umhüllen, oder gibt es einen weniger chaotischen Weg? – Saustin

+1

Ja. Zu meiner Antwort hinzugefügt – ccpgh