MinWG 中对 _imp_* 的未定义引用

undefined reference to _imp_* in MinWG

我想为使用 ftd2xx 驱动程序的库编译一个简单的测试项目。我已经在 linux 上成功编译了它,我正试图在 Windows 上做同样的事情。主要区别是对库进行了一些小修改。

我要编译的测试文件是这样的:

//#include "HPX-linux.h"
#include "HPX-Windows.h"
#include <stdlib.h>
#include <stdio.h>

int main(){
    int devs;
    getSerialNum(&devs);
    printf("%d\n\n", devs);
    simpleTest("./myTest/");
    return 0;
}

而HPX-Windows.h的预处理指令如下:

#ifndef HPXLINUX_H
#define HPXLINUX_H

#include <math.h>
#include <stdint.h>
#include <time.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/time.h>
#include "ftd2xx.h"
#include <pthread.h>

// typedefs
//typedef uint16_t DWORD;
#ifndef __cplusplus
typedef uint8_t bool;
#endif

// static const defines
#ifndef __cplusplus
#define TRUE 1
#define FALSE 0
#endif
#define SUCCESS 0
#define FAILURE -1
#define RETRIEDTOOMANY -10
#define LOSTHEADFRAME -11
#define GOTAV 2

#ifdef __unix__
#define PRELIB extern
#elif _WIN32
#ifdef ADD_EXPORTS
#define PRELIB __declspec(dllexport)
#else
#define PRELIB __declspec(dllimport)
#endif
#endif

#ifdef __unix__
#define CALL
#elif _WIN32
#define CALL __cdecl
#endif

关于 ftd2xx,我有 2 个 .h 头文件,一个 .lib 和一个 .dll。

正确安装驱动程序后,我可以在 linux 上编译库:

gcc -o test test.c -Wall -Wextra -lHPX-linux -lftd2xx -lm

我在 Windows 上使用 MinGW。我使用的命令是:

gcc test.c HPX-Windows.c -L -lftd2xx -g

然后我得到一个错误列表,类型为“undefined reference to _imp__*”,是一个函数。我以为它们是ftd2xx.h的函数,但它也恰好是HPX-Windows.h中声明的函数,包括getSerialNum和simpleTest。为什么当我使用 .c 源文件而不是库时会发生这种情况?

错误是由无法从共享库 (.DLL) 导入的 header 文件中使用 __declspec(dllimport) 导出的符号引起的。

我建议从 ftd2xx.dll 文件创建一个 libftd2xx.dll.a 文件并 link 使用它(例如,如果文件在当前目录中使用 -L. -lftd2xx.dll) .

或者您可以通过在 gcc 命令中指定 .dll 文件来 link,像这样:gcc -o test.exe test.c HPX-Windows.c ftd2xx.dll -g).

如果这不起作用,请检查 ftd2xx.h 以查看 __declspec(dllimport) 的导入位置,并查看是否可以设置导致 header 不使用 __declspec(dllexport) 的定义]/__declspec(dllimport) 和 link 与你的 lib 文件,以防它是一个静态库(类似于:gcc --static -o test.exe test.c HPX-Windows.c -L. -lftd2xx -g)。