对 `_imp__SetupDiGetClassDevsA@16' 的未定义引用(即使使用 -lsetupapi)

Posted

技术标签:

【中文标题】对 `_imp__SetupDiGetClassDevsA@16\' 的未定义引用(即使使用 -lsetupapi)【英文标题】:undefined reference to `_imp__SetupDiGetClassDevsA@16' (even with -lsetupapi)对 `_imp__SetupDiGetClassDevsA@16' 的未定义引用(即使使用 -lsetupapi) 【发布时间】:2017-09-17 09:39:07 【问题描述】:

这是我为这个讨厌的问题苦苦挣扎的第二天。 我尝试编译的测试代码:

#include <windows.h>
#include <setupapi.h>
#include <initguid.h>
#include <devguid.h>

int main(void)

    HDEVINFO device_info_set = SetupDiGetClassDevs(
        (const GUID *) &GUID_DEVCLASS_PORTS,
        NULL,
        NULL,
        DIGCF_PRESENT);
        
    return 0;

还有mingw输出:

loleq@loleq-Pc MINGW32 /c/Users/loleq/Downloads/openpst/openpst/sahara/lib/libopenpst/lib/serial/examples
$ gcc --version
gcc.exe (i686-posix-dwarf-rev0, Built by MinGW-W64 project) 5.3.0
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


loleq@loleq-Pc MINGW32 /c/Users/loleq/Downloads/openpst/openpst/sahara/lib/libopenpst/lib/serial/examples
$ gcc -lsetupapi -lhid  test.c
C:\opt\msys2_64\tmp\ccJZHvjA.o:test.c:(.text+0x36): undefined reference to `_imp__SetupDiGetClassDevsA@16'
collect2.exe: error: ld returned 1 exit status

主机系统是 Win7 64 位,我没有安装任何额外的库,即 DDK 左右...我相信丢失的引用应该由 libsetupapi.a (-lsetupapi) 处理,这当然存在于 MinGW 库中。 有什么建议么? 顺便说一句:我现在使用的 MinGW 是由 Qt 提供的。

【问题讨论】:

我记得前段时间读过一些东西,建议在指定源文件后放置库(可能是 MinGW 的东西),所以你可以试试gcc test.c -lsetupapi -lhid 哇,先生,你是我的英雄。看起来它真的解决了这个问题。谢谢约翰。 很高兴听到这个消息,我会继续提交它作为答案。 What is an undefined reference/unresolved external symbol error and how do I fix it?的可能重复 Your linkage consumes libraries before the object files that refer to them回答 【参考方案1】:

问题似乎是由于调用 MinGW gcc 二进制文件时的参数排序造成的。

我前段时间在某处读到,使用 MinGW 时需要最后指定库,因此您的命令应该是:

$ gcc test.c -lsetupapi -lhid

【讨论】:

以上是关于对 `_imp__SetupDiGetClassDevsA@16' 的未定义引用(即使使用 -lsetupapi)的主要内容,如果未能解决你的问题,请参考以下文章

OpenAL 问题,未定义对“_imp__alGenBuffers”的引用

TCL - 对 g++ 的 `_imp__Tcl_ResetResult' 的未定义引用

如何在链接到静态库的 DEV-CPP 中构建控制台应用程序时解决对 _imp__** 的未定义引用?

错误: - 未定义引用 `_imp__GetStockObject@4' 和未定义引用 `_imp__SetBkMode@8'

__imp_ 符号的语义

vs2017.unresolved external symbol __imp__fprintf&__imp____iob_func