c - 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));
有谁知道为什么编译器在源代码中找不到这些函数?
解决方案
好的,所以经过数小时的反复试验,这个问题是由源文件假设 MSVC 作为编译器(而不是 MSYS2 使用的 gcc)并在函数定义中添加 __declspec(dllexport) 和 __declspec(dllimport) 修饰符引起的。
推荐阅读
- node.js - 在 ExpressJS 中处理可选参数的最佳实践
- vue.js - 简单的 Vue 应用程序只显示空白页面 (webpack-dev-server)
- excel - 使用 VBA 在 Excel 中更新 PowerPivot
- data-binding - 使用 i18n 文件在设计时动态更改 SAPUI5 列表项绑定
- java - 如何对包含 vertx().eventBus().send() 的方法进行单元测试?
- r - 动态求和多列
- git - Integrate Git Support Branch to master
- linux - bitbucket 中的管道因作曲家错误而失败
- json - 如何在图表 js 中使用 JSON 文件?
- objective-c - 无法在最新的 OSX 10.13.4 中写入/删除文件