【问题标题】:MSYS2 undefined reference to _imp__XXXXXXXXMSYS2 未定义对 _imp__XXXXXXXX 的引用
【发布时间】:2020-01-10 23:14:32
【问题描述】:

我正在尝试使用 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));

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

【问题讨论】:

    标签: c gcc mingw ld msys2


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2020-10-30
      • 2018-08-04
      • 1970-01-01
      • 1970-01-01
      • 2022-11-14
      • 1970-01-01
      • 2011-03-27
      • 2022-01-22
      • 2016-04-04
      相关资源
      最近更新 更多