2017-01-23 10 views
0

Вот мой включает в себя:г ++ неопределенная ссылка на 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 

А вот мой г ++ 4.2.1 Команда с ошибками компиляции:

# 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 

Похожие код C компилирует отлично с GCC. Я не считаю, что порядок параметров - это проблема - Я пробовал несколько вариантов, включая перемещение -I, -L и обоих флагов -l. Оба scrypt и sqlite3 являются библиотеками C, а sqlite3 не вызывает ошибок, несмотря на то, что заголовок и разделяемая библиотека в -I и -L соответственно.

ответ

1

Посмотрите на решение здесь.

Using C Libraries for C++ Programs

 

    extern "C"{ 
    void c_function_prototype(); 
    } 

или

 

    extern "C" void c_function_prototype(); 

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

извините, но я не могу оставить комментарий (на главный вопрос) все же ... не – ccpgh

+0

Ого, у меня не было ни малейшего понятия. Является предпочтительным способом для переноса моего #include с помощью extern «C» {...}, или есть менее грязный способ? – Saustin

+1

Да. Добавлено в мой ответ – ccpgh