проблема линковки в g ++ - PullRequest
       10

проблема линковки в g ++

1 голос
/ 27 февраля 2010

У меня есть библиотека зависимостей (libfcgi), которую я скомпилировал с помощью g ++ (GCC v4.4 MinGW), используя следующие вызовы:

g ++ -Включить -c -O2 * .c
ar rcs ../libfcgi.a * .o

Теперь мой основной проект построен так:

g ++ -Idependancies \ libfcgi \ include -Ldependancies -O2 -lfcgi * .cpp

g ++, по-видимому, находит libfcgi.a, но все же не может ссылаться на следующие ссылки:

FCGI_printf '
'FCGI_Accept'

В источниках libfcgi эти функции определены следующим образом:

#ifdef __cplusplus
extern "C" {
#endif
//...
DLLAPI int FCGI_printf(const char *format, ...);  
DLLAPI int FCGI_Accept(void);
//...
#ifdef __cplusplus
}
#endif

где DLLAPI - это ничто (поскольку оно не скомпилировано как разделяемая библиотека) и определен __cplusplus (g ++).

Глядя на libfcgi.a, эти функции экспортируются как '_FCGI_Accept' и '_FCGI_printf', поэтому с подчеркиванием впереди. Вот что, кажется, мешает g ++ найти их.

Я думал, что использования экспорта "C" будет достаточно для ссылки на функцию C в C ++, так что я делаю неправильно?

Спасибо:)

Ответы [ 2 ]

4 голосов
/ 27 февраля 2010

Если у вас есть те же самые внешние определения "C" в ваших источниках .cpp, то я думаю, что ваша проблема в том, что -lfcgi должен следовать * .cpp в вашей командной строке:

g++ -Idependancies\libfcgi\include -Ldependancies -O2 *.cpp -lfcgi
1 голос
/ 27 февраля 2010

В вашем главном проекте вы указываете компилятору связывать C-функции из-за extern "C". Следовательно, он ожидает беспорядочных имен символов. Поэтому вы должны скомпилировать библиотеку fcgi с помощью компилятора C, а не компилятора C ++.

...