首页 > 解决方案 > MSYS2 未定义对 _imp__XXXXXXXX 的引用

问题描述

我正在尝试使用 MSYS2 编译一个相当简单的库,但我得到了一些奇怪的未定义引用错误,即使这些函数包含在我正在编译的文件中。
Makefile 的相关部分:

luars232.dll: librs232_windows.o librs232.o luars232.o
    $(CC) $(LDFLAGS) -o luars232.dll luars232.o librs232.o librs232_windows.o -L./lua-5.1.5/src/ -llua

luars232.o: librs232/bindings/lua/luars232.c
    $(CC) $(CFLAGS) librs232/bindings/lua/luars232.c -o luars232.o

librs232.o: librs232/src/rs232.c
    $(CC) $(CFLAGS) librs232/src/rs232.c -o librs232.o

librs232_windows.o: librs232/src/rs232_windows.c
    $(CC) $(CFLAGS) librs232/src/rs232_windows.c -o librs232_windows.o

编译输出的前几行:

$ make windows
cc -c -fPIC -I librs232/include/ -I/usr/include/lua5.1/ -I/usr/include/json -I./lua-5.1.5/src/ -DWIN32 librs232/src/rs232_windows.c -o librs232_windows.o
cc -c -fPIC -I librs232/include/ -I/usr/include/lua5.1/ -I/usr/include/json -I./lua-5.1.5/src/ -DWIN32 librs232/src/rs232.c -o librs232.o
cc -c -fPIC -I librs232/include/ -I/usr/include/lua5.1/ -I/usr/include/json -I./lua-5.1.5/src/ -DWIN32 librs232/bindings/lua/luars232.c -o luars232.o
cc -shared -DWIN32 -o luars232.dll luars232.o librs232.o librs232_windows.o -L./lua-5.1.5/src/ -llua
C:/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/9.2.0/../../../../i686-w64-mingw32/bin/ld.exe: luars232.o:luars232.c:(.text+0x46): undefined reference to `_imp__rs232_init'
C:/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/9.2.0/../../../../i686-w64-mingw32/bin/ld.exe: luars232.o:luars232.c:(.text+0x8b): undefined reference to `_imp__rs232_set_device'
C:/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/9.2.0/../../../../i686-w64-mingw32/bin/ld.exe: luars232.o:luars232.c:(.text+0x98): undefined reference to `_imp__rs232_open'
C:/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/9.2.0/../../../../i686-w64-mingw32/bin/ld.exe: luars232.o:luars232.c:(.text+0xae): undefined reference to `_imp__rs232_close'

并且摘自 rs232_windows.c 以显示它正在寻找的函数实际上是在源代码中定义的:

RS232_LIB struct rs232_port_t *
rs232_init(void)
{
    struct rs232_port_t *p = NULL;
    struct rs232_windows_t *wx = NULL;
    p = (struct rs232_port_t *) malloc(sizeof(struct rs232_port_t));

有谁知道为什么编译器在源代码中找不到这些函数?

标签: cgccmingwldmsys2

解决方案


好的,所以经过数小时的反复试验,这个问题是由源文件假设 MSVC 作为编译器(而不是 MSYS2 使用的 gcc)并在函数定义中添加 __declspec(dllexport) 和 __declspec(dllimport) 修饰符引起的。


推荐阅读