ปัญหาการเชื่อมโยง 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_ยอมรับ'

ในซอร์ส 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)


หากคุณมีคำจำกัดความภายนอก "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-library ด้วยคอมไพเลอร์ C ไม่ใช่คอมไพเลอร์ C++

person edgar.holleis    schedule 27.02.2010
comment
ตกลง ฉันพยายามรวบรวม libfcgi ด้วย gcc แต่ปัญหายังคงอยู่ :( - person Milan; 27.02.2010