проблема с подключением g++

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

g++ -Iinclude -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++, так что я делаю неправильно?

Спасибо :)


person Milan    schedule 27.02.2010    source источник


Ответы (2)


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

g++ -Idependancies\libfcgi\include -Ldependancies -O2 *.cpp -lfcgi
person Richard Pennington    schedule 27.02.2010
comment
Вы действительно считаете, что порядок аргументов имеет значение в данном случае? - person edgar.holleis; 27.02.2010
comment
Да, это так. Объектные файлы библиотек включаются только из предшествующих объектных файлов, в которых есть ссылки на символы. - person Richard Pennington; 27.02.2010
comment
Ха! Хотите верьте, хотите нет, но в сочетании с ответом edgar.holleis это действительно работает! Спасибо! - person Milan; 27.02.2010

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

person edgar.holleis    schedule 27.02.2010
comment
Хорошо, я попытался скомпилировать libfcgi с помощью gcc, но проблема осталась :( - person Milan; 27.02.2010