masalah penautan g++

Saya memiliki perpustakaan ketergantungan (libfcgi) yang saya kompilasi dengan g++ (GCC v4.4 MinGW) menggunakan panggilan berikut:

g++ -Iinclude -c -O2 *.c
ar rcs ../libfcgi.a *.o

Sekarang, proyek utama saya dibuat seperti ini:

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

g++ rupanya menemukan libfcgi.a, namun gagal menautkan ke referensi berikut:

'FCGI_printf'
'FCGI_Terima'

Di sumber libfcgi, fungsi-fungsi ini didefinisikan sebagai berikut:

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

di mana DLLAPI bukan apa-apa (karena tidak dikompilasi sebagai perpustakaan bersama) dan __cplusplus didefinisikan (g++).

Melihat libfcgi.a, fungsi-fungsi tersebut diekspor sebagai '_FCGI_Accept' dan '_FCGI_printf', jadi dengan garis bawah di depannya. Hal itulah yang tampaknya menghalangi g++ untuk menemukannya.

Saya pikir menggunakan ekspor "C" sudah cukup untuk menautkan ke fungsi C di C++, jadi apa yang saya lakukan salah?

Terima kasih :)


person Milan    schedule 27.02.2010    source sumber


Jawaban (2)


Jika Anda memiliki definisi "C" eksternal yang sama di sumber .cpp Anda, maka menurut saya masalah Anda adalah -lfcgi harus mengikuti *.cpp di baris perintah Anda:

g++ -Idependancies\libfcgi\include -Ldependancies -O2 *.cpp -lfcgi
person Richard Pennington    schedule 27.02.2010
comment
Anda benar-benar menganggap urutan argumen penting dalam kasus ini? - person edgar.holleis; 27.02.2010
comment
Ya, benar. File objek perpustakaan hanya disertakan dari file objek sebelumnya yang memiliki referensi ke simbol di dalamnya. - person Richard Pennington; 27.02.2010
comment
Ha! Percaya atau tidak, tapi dikombinasikan dengan jawaban edgar.holleis, itu benar-benar berhasil! Terima kasih! - person Milan; 27.02.2010

Dalam proyek utama Anda, Anda memberi tahu kompiler untuk menghubungkan fungsi-C, karena extern "C". Oleh karena itu, ia mengharapkan nama-simbol yang tidak terkotori. Oleh karena itu, Anda harus mengkompilasi perpustakaan fcgi dengan kompiler C, bukan kompiler C++.

person edgar.holleis    schedule 27.02.2010
comment
Oke, saya mencoba mengkompilasi libfcgi dengan gcc, tetapi masalahnya masih ada :( - person Milan; 27.02.2010