Win10下MSYS2 MinGW64链接ftd2xx库出现未定义引用错误
问题:MinGW64链接FTD2XX库出现未定义引用错误
我在Win10机器上安装了MSYS2及MinGW64,下载了Linux版D2XX驱动,解压后将ftd2xx.h放入C:\msys64\mingw64\include目录,libftd2xx.a放入C:\msys64\mingw64\lib目录。使用命令:
gcc eeprom_example.c -o eeprom_example -lftd2xx
编译程序时,出现以下链接错误:
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\ASIDES~1\AppData\Local\Temp\ccHdJs8k.o:eeprom_example:(.text+0xbc): undefined reference to `__imp_FT_EEPROM_Read' C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\ASIDES~1\AppData\Local\Temp\ccHdJs8k.o:eeprom_example:(.text+0x205): undefined reference to `__imp_FT_EEPROM_Program' C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\ASIDES~1\AppData\Local\Temp\ccHdJs8k.o:eeprom_example:(.text+0x26e): undefined reference to `__imp_FT_Open' C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\ASIDES~1\AppData\Local\Temp\ccHdJs8k.o:eeprom_example:(.text+0x2d9): undefined reference to `__imp_FT_Close' C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\ASIDES~1\AppData\Local\Temp\ccHdJs8k.o:eeprom_example:(.text+0x34a): undefined reference to `__imp_FT_Close' C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\ASIDES~1\AppData\Local\Temp\ccHdJs8k.o:eeprom_example:(.text+0x364): undefined reference to `__imp_FT_Close' collect2.exe: error: ld returned 1 exit status
以下是我的代码:
#include <stdio.h> #include <stdlib.h> #include <stdint.h> #include "ftd2xx.h" #define EEPROM_SIZE 256 // 读取EEPROM内容的函数 FT_STATUS readEEPROM(FT_HANDLE handle, uint8_t* eepromData, uint32_t eepromSize) { FT_STATUS status; DWORD bytesRead; char manufacturer[256]; char manufacturerId[256]; char description[256]; char serialNumber[256]; status = FT_EEPROM_Read(handle, eepromData, eepromSize, manufacturer, manufacturerId, description, serialNumber); if (status != FT_OK) { printf("Failed to read EEPROM: %d ", status); return status; } printf("EEPROM content: "); for (int i = 0; i < eepromSize; i++) { printf("Address 0x%02X: 0x%02X ", i, eepromData[i]); } return FT_OK; } // 写入EEPROM内容的函数 FT_STATUS writeEEPROM(FT_HANDLE handle, uint8_t* eepromData, uint32_t eepromSize) { FT_STATUS status; DWORD bytesWritten; // FT_EEPROM_Program的示例用法 char manufacturer[] = "Manufacturer"; char manufacturerId[] = "ManufacturerId"; char description[] = "Description"; char serialNumber[] = "SerialNumber"; status = FT_EEPROM_Program(handle, eepromData, eepromSize, manufacturer, manufacturerId, description, serialNumber); if (status != FT_OK) { printf("Failed to write EEPROM: %d ", status); return status; } printf("EEPROM content written successfully! "); return FT_OK; } int main() { FT_STATUS status; FT_HANDLE handle; uint8_t eepromData[EEPROM_SIZE]; // 初始化并打开FTDI设备 status = FT_Open(0, &handle); if (status != FT_OK) { printf("Failed to open FTDI device: %d ", status); return 1; } // 读取EEPROM内容 status = readEEPROM(handle, eepromData, EEPROM_SIZE); if (status != FT_OK) { FT_Close(handle); return 1; } // 修改EEPROM内容(示例:将所有字节设为0xFF) for (int i = 0; i < EEPROM_SIZE; i++) { eepromData[i] = 0xFF; } // 写入EEPROM内容 status = writeEEPROM(handle, eepromData, EEPROM_SIZE); if (status != FT_OK) { FT_Close(handle); return 1; } // 关闭FTDI设备 FT_Close(handle); return 0; }
解决方案
核心问题
你误用了Linux版的FTD2XX库,但MinGW64是用来编译Windows平台程序的,两者平台不匹配。链接错误中的__imp_前缀是Windows动态库导入表的符号,Linux库中根本没有这些符号,自然会出现未定义引用。
修复步骤
清理错误的库文件
删除C:\msys64\mingw64\include\ftd2xx.h和C:\msys64\mingw64\lib\libftd2xx.a,彻底移除Linux版库文件。部署正确的Windows版库文件
下载对应x64架构的Windows版D2XX驱动(匹配MinGW64的64位环境),解压后:- 将
ftd2xx.h放到C:\msys64\mingw64\include目录 - 将
libftd2xx.a(静态库/导入库)和ftd2xx.dll(动态库)放到C:\msys64\mingw64\lib目录;或者把ftd2xx.dll直接放到最终生成的程序运行目录。
- 将
修改编译命令
添加-DFTD2XX_STATIC宏,告诉编译器以静态方式链接库,避免动态导入符号的问题:gcc eeprom_example.c -o eeprom_example -DFTD2XX_STATIC -lftd2xx修复代码中的换行符问题
你代码里的printf语句用的是,这是无效的转义字符,需要改成标准的\n,否则编译会报错。
补充说明
Windows平台的FTD2XX库分静态和动态两种:
- 静态链接:用
-DFTD2XX_STATIC宏,链接libftd2xx.a,生成的程序不需要额外携带ftd2xx.dll - 动态链接:不需要该宏,但要确保链接的是对应导入库,且程序运行时能找到
ftd2xx.dll
内容的提问来源于stack exchange,提问作者ASiDesigner
相关产品推荐
相关产品推荐

