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
)。
我想为使用 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
)。