Здравствуйте.Вопрос:
Можно ли использовать библиотеку, написанную на С++, в проекте написанном на чистом С?
Если да, то как?Например:
//----- исходник библиотеки -----
//file: mylib.cpp#include <stdio.h>
void lib_print(int i)
{
printf("Hello, boss. Incomming parameter is %d.\n", i);
}//----- исходник пользователя библиотекой -----
//file: libuser.cvoid lib_print(int i);
int main()
{
lib_print(20);
return 0;
}//----- сборка либы -----
g++ -Wall lib.cpp -c
ar rc libmylib.a lib.o
ranlib libmylib.a//----- сборка пользователя -----
gcc -Wall -o libuser_c libuser.c -L. -lmylibОШИБКА:
./libmylib.a(lib.o):(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit statusЗаранее всем спасибо!!!
>//----- сборка пользователя -----
>gcc -Wall -o libuser_c libuser.c -L. -lmylib-lstdc++
>>//----- сборка пользователя -----
>>gcc -Wall -o libuser_c libuser.c -L. -lmylib
>
>-lstdc++Заработало. Спасибо!
Только еще надо было добавить
extern "C" { _здесь_ф-ии_которые_будут_вызываться_из_С_кода_ }
В итоге пример пользования таков:
//----- исходник библиотеки -----
//file: mylib.cpp#include <stdio.h>
class MyClass
{
public:
MyClass() { printf("Constructor MyClass.\n"); }
~MyClass() { printf("Destructor MyClass.\n"); }
};extern "C"
{
void lib_print(int i)
{
MyClass a;
printf("Hello, boss. Incomming parameter id %d.\n", i);
}
}//----- исходник пользователя библиотекой -----
//file: libuser.cvoid lib_print(int i);
int main()
{
lib_print(20);
return 0;
}//----- сборка либы -----
g++ -Wall lib.cpp -c
ar rc libmylib.a lib.o
ranlib libmylib.a//----- сборка пользователя -----
gcc -Wall -o libuser_c libuser.c -L. -lmylib -lstdc++Вывод на консоль:
./libuser_c
Constructor MyClass.
Hello, boss. Incomming parameter id 20.
Destructor MyClass.Пэ.Эс. У меня gcc не знал где искать libstdC++.a и пришлось добывить в сборку пользователя путь к ней -L/usr/lib/gcc/i386-redhat-linux/4.3.0/