【问题标题】:undefined reference to `_GetAdaptersAddresses@20' - but I included -liphlpapi对`_GetAdaptersAddresses@20'的未定义引用-但我包括了-liphlpapi
【发布时间】:2012-06-10 22:22:06
【问题描述】:

我在cygwin 下使用gcc 编写一些代码,在我的代码中从iphlpapi.h 调用GetAdaptersAddresses已添加 -liphlpapi 但链接器仍然失败并显示以下消息:

gcc -liphlpapi build/obj/*.o -Wall -Wextra -o build/bin/asdf.exe src/asdf.cpp
/tmp/ccdjLPVY.o:asdf.cpp:(.text+0x153): undefined reference to `_GetAdaptersAddresses@20'
collect2: ld returned 1 exit status

来自asdf.cpp的一些sn-ps:

#if _WIN32_WINNT < 0x0501
  #warning _WIN32_WINNT was set lower than 0x0501, fixing
  #undef _WIN32_WINNT
  #define _WIN32_WINNT 0x0501
#endif
#include <winsock2.h>
#include <iphlpapi.h>

我知道他们在那里该死的:

strings /usr/i686-pc-mingw32/sys-root/mingw/lib/libiphlpapi.a  | sort | uniq | grep GetAdapters
__imp__GetAdaptersAddresses@20
__imp__GetAdaptersInfo@8
_GetAdaptersAddresses@20
_GetAdaptersInfo@8
GetAdaptersAddresses
GetAdaptersInfo

$strings /usr/lib/w32api/libiphlpapi.a  | sort | uniq | grep GetAdapters
__imp__GetAdaptersAddresses@20
__imp__GetAdaptersInfo@8
_GetAdaptersAddresses@20
_GetAdaptersInfo@8
GetAdaptersAddresses
GetAdaptersInfo

有人看到我错过了什么吗?

编辑:回答

# Change the order, put the linker options last:
# Before:
gcc -liphlpapi build/obj/*.o -Wall -Wextra -o build/bin/asdf.exe src/asdf.cpp
# After:
gcc            build/obj/*.o -Wall -Wextra -o build/bin/asdf.exe src/asdf.cpp -liphlpapi

【问题讨论】:

  • This question 谈论订单的重要性。这有帮助吗?
  • @chris 成功了,请使用该链接提交答案

标签: c++ c winapi gcc cygwin


【解决方案1】:

正如this question 中所述,gcc 参数的顺序很重要。您需要将库包含移动到依赖它的对象之后。

所以gcc build/obj/*.o -liphlpapi ...

【讨论】:

    【解决方案2】:

    尝试添加#pragma comment(lib, "Iphlpapi.lib")

    【讨论】:

    • 这在 GCC 上不起作用。我记得当我的设置由于闪存驱动器上的技术性而不断重置时,我曾广泛尝试过。
    • @chris 因为#pragma 专门设置了编译器定义的指令。
    • @Hi-Angel,是的。我的观点是 OP 显然使用 GCC,而这个答案只适用于 MSVC。
    猜你喜欢
    • 2012-07-01
    • 2014-02-18
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多