URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8273
[ Назад ]

Исходное сообщение
"Возмжно ли использовать библиотеку на С++ в проекте на С?"

Отправлено worman , 20-Май-09 09:46 
Здравствуйте.

Вопрос:
Можно ли использовать библиотеку, написанную на С++, в проекте написанном на чистом С?
Если да, то как?

Например:

//----- исходник библиотеки -----
//file:  mylib.cpp

#include <stdio.h>
void lib_print(int i)
{
    printf("Hello, boss. Incomming parameter is %d.\n", i);
}

//----- исходник пользователя библиотекой -----
//file:  libuser.c

void 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

Заранее всем спасибо!!!


Содержание

Сообщения в этом обсуждении
"Возмжно ли использовать библиотеку на С++ в проекте на С?"
Отправлено Аноним , 20-Май-09 10:44 
>//----- сборка пользователя -----
>gcc -Wall -o libuser_c libuser.c -L. -lmylib

-lstdc++


"Возмжно ли использовать библиотеку на С++ в проекте на С?"
Отправлено worman , 20-Май-09 11:16 
>>//----- сборка пользователя -----
>>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.c

void 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/