2012-04-07 17 views
9

Tôi đang cố gắng biên dịch cái gì đó phụ thuộc vào gtkspell, trong đó phụ thuộc vào enchant, dưới MinGW. Tôi nhận được lỗi như gtkspell/gtkspell.c:757: undefined reference to '_imp__enchant_broker_init' Tôi nghi ngờ điều này là do tôi đang cố gắng liên kết againt thư viện {tĩnh, động} khi tôi liên kết với một trình duyệt khác hoặc vì chỉ có một gạch dưới trước khi imp và cần có hai; Tôi nhận đượcLàm cách nào để sửa tham chiếu không xác định thành _imp __ *?

$ objdump -t /d/opt/enchant-1.6.0/lib/libenchant.a | grep enchant_broker_init 
[ 85](sec 1)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x00002ac0 _enchant_broker_init 

$ objdump -t /d/opt/enchant-1.6.0/lib/libenchant.dll.a | grep enchant_broker_init 
[ 6](sec 1)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000000 _enchant_broker_init 
[ 7](sec 3)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000000 __imp__enchant_broker_init 

Internet (http://lists.freedesktop.org/archives/gstreamer-devel/2007-January/013975.html) gợi ý rằng imp mangling đến từ

_declspec(dll{import,export}) 

dù enchant dường như sử dụng

__declspec(dll{import,export}) 

và nhận xét các dòng có liên quan trong enchant.h làm cho gtkspell.c yêu cầu enchant_broker_init thay vì _imp__enchant_broker_init, nhưng không thay đổi các ký hiệu hiển thị trong trạng thái libenchant. Có cách nào để làm cho gcc không mangle tên, hoặc không ai có ý tưởng về những gì có thể sẽ sai/làm thế nào để sửa chữa nó?

Dưới đây là một ví dụ rất nhỏ nhằm tái tạo vấn đề trên hệ thống của tôi:

Nếu tôi có một enchanttest1.c tập tin với nội dung

#include <stdio.h> 
#include <enchant.h> 

int main() 
{ 
#ifdef ENCHANT_MODULE_EXPORT 
    printf("\nEnchant found\n"); 
#else 
    printf("\nEnchant not found\n"); 
#endif 
    return 0; 
} 

và một tập tin enchanttest2.c với nội dung

#include <stdio.h> 
#include <enchant.h> 

int main() 
{ 
    EnchantBroker *b = enchant_broker_init(); 
#ifdef ENCHANT_MODULE_EXPORT 
    printf("\nEnchant found\n"); 
#else 
    printf("\nEnchant not found\n"); 
#endif 
    return 0; 
} 

rồi

gcc enchanttest1.c `pkg-config --cflags enchant` && ./a.exe 

cho Enchant found nhưng

gcc enchanttest2.c `pkg-config --cflags enchant` && ./a.exe 

cho

C:\Users\JASONG~1\AppData\Local\Temp\ccyDLptc.o:testenchant.c:(.text+0xf): undefined reference to `_imp__enchant_broker_init' 
collect2: ld returned 1 exit status 
+0

Đây là một gợi ý ngu ngốc, nhưng bạn có chắc chắn rằng bạn đang gọi trình biên dịch C (không phải C++) không? Bạn có thể đang gặp phải sự lố bịch mang tính lúng túng tinh tế? –

+0

Các 'enchant.h' tệp kết thúc tốt đẹp mọi thứ trong '#ifdef __cplusplus bên ngoài" C "{ # endif' vì vậy tôi không nghĩ đó là vấn đề. Tôi cũng kể từ khi thêm một ví dụ tối thiểu, nơi tôi khá chắc chắn tôi đang gọi C compilation. –

+0

Là một lưu ý cho người theo dõi, khi tôi nhận được điều này là do "thư viện phụ thuộc" được xác định bằng __declspec (dllimport), mặc dù nó là một biên dịch tĩnh. Vì vậy, loại bỏ nó cố định nó lên, xem http://betterlogic.com/roger/2012/09/libflite-cross-compile-woe/ – rogerdpack

Trả lời

5

Cách để sửa chữa dụ tối thiểu của tôi là thêm --libs sau --cflags; gcc không thể tìm thấy thư viện để liên kết.

Tôi đã có thể khắc phục sự cố mà tôi đang chạy với mã phức tạp hơn mà ban đầu tôi đang cố gắng biên dịch (gummi (http://dev.midnightcoding.org/projects/gummi)) bằng cách chuyển LDFLAGS="$(pkg-config --cflags --libs gtkspell-2.0 enchant)" CFLAGS="$(pkg-config --cflags --libs gtkspell-2.0 enchant)" vào kịch bản cấu hình; vấn đề dường như đã được rằng các đối số để gcc đã được thông qua theo thứ tự sai, và nó không thể tìm thấy enchant khi nó đã cố gắng liên kết gtkspell.

Các vấn đề liên quan