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
và
$ 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
Đâ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ế? –
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. –
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