You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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库中根本没有这些符号,自然会出现未定义引用。

修复步骤

  1. 清理错误的库文件
    删除C:\msys64\mingw64\include\ftd2xx.h和C:\msys64\mingw64\lib\libftd2xx.a,彻底移除Linux版库文件。

  2. 部署正确的Windows版库文件
    下载对应x64架构的Windows版D2XX驱动(匹配MinGW64的64位环境),解压后:

    • 将ftd2xx.h放到C:\msys64\mingw64\include目录
    • 将libftd2xx.a(静态库/导入库)和ftd2xx.dll(动态库)放到C:\msys64\mingw64\lib目录;或者把ftd2xx.dll直接放到最终生成的程序运行目录。
  3. 修改编译命令
    添加-DFTD2XX_STATIC宏,告诉编译器以静态方式链接库,避免动态导入符号的问题:

    gcc eeprom_example.c -o eeprom_example -DFTD2XX_STATIC -lftd2xx
    
  4. 修复代码中的换行符问题
    你代码里的printf语句用的是 ,这是无效的转义字符,需要改成标准的\n,否则编译会报错。

补充说明

Windows平台的FTD2XX库分静态和动态两种:

  • 静态链接:用-DFTD2XX_STATIC宏,链接libftd2xx.a,生成的程序不需要额外携带ftd2xx.dll
  • 动态链接:不需要该宏,但要确保链接的是对应导入库,且程序运行时能找到ftd2xx.dll

内容的提问来源于stack exchange,提问作者ASiDesigner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 04:45:03