Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
链接器错误使用windns.h和gcc编译代码_C_Windows_Winapi_Gcc - Fatal编程技术网

链接器错误使用windns.h和gcc编译代码

链接器错误使用windns.h和gcc编译代码,c,windows,winapi,gcc,C,Windows,Winapi,Gcc,我正在尝试用C语言执行一个简单的DNS查找。下面是我的代码(我主要从一个示例中获取): #包括 #包括 #包括 字符*DNS_查找(字符*主机){ DNS_STATUS STATUS;//DnsQuery_A()函数的返回值。 PDNS_RECORD pDnsRecord;//指向DNS_记录结构的指针。 PIP4_数组pSrvList=NULL;//指向IP4_数组结构的指针。 WORD wType;//要查询的记录的类型。 char*pOwnerName=host;//要查询的所有者名称。

我正在尝试用C语言执行一个简单的DNS查找。下面是我的代码(我主要从一个示例中获取):

#包括
#包括
#包括
字符*DNS_查找(字符*主机){
DNS_STATUS STATUS;//DnsQuery_A()函数的返回值。
PDNS_RECORD pDnsRecord;//指向DNS_记录结构的指针。
PIP4_数组pSrvList=NULL;//指向IP4_数组结构的指针。
WORD wType;//要查询的记录的类型。
char*pOwnerName=host;//要查询的所有者名称。
char pReversedIP[255];//反向IP地址。
char DnsServIp[255];//DNS服务器ip地址。
DNS_FREE_类型freetype;
freetype=DnsFreeRecordList;//DnsFreeRecordListDeep;
IN_ADDR ipaddr;
status=DnsQuery(pOwnerName,//指向OwnerName的指针。
wType,//要查询的记录的类型。
DNS\u QUERY\u BYPASS\u CACHE,//绕过查找上的解析程序缓存。
pSrvList,//包含DNS服务器IP地址。
&pDnsRecord,//包含响应的资源记录。
NULL);//保留供将来使用。
如果(状态){
printf(“无法查询%s的主机记录,错误为%d\n”,pOwnerName,status);
}否则{
ipaddr.S_un.S_addr=(pDnsRecord->Data.A.IpAddress);
printf(“主机%s的IP地址是%s\n”,pOwnerName,inet_ntoa(ipaddr));
//为DNS记录分配的可用内存。
DnsRecordListFree(pDnsRecord,freetype);
}
LocalFree(pSrvList);
返回inet_ntoa(ipaddr);
}
当我尝试编译时,会出现链接器错误(为了清晰起见,我已经清理了一些):

gcc-gmain.cdns.c-o build.exe-D WIN-lws2_32-w
c://mingw32/bin/ld.exe:/ccRVIgMi.o:在函数“Z10DNS_LookupPc”中:
../dns.c:17:对'DnsQuery'的未定义引用_A@24'
c://mingw32/bin/ld.exe:/dns.c:30:对的未定义引用`DnsRecordListFree@8'
collect2.exe:错误:ld返回了1个退出状态

我知道为了使用
winsock2.h
编译代码,我必须将
-lws2_32
添加到我的gcc命令中,我猜我必须使用
windns.h
编译代码,但我一直无法在网上找到任何帮助。

正确答案应该是

 gcc -g main.c dns.c -o build.exe -D WIN -lws2_32 -ldnsapi -w
但正如你所发现的,它不起作用。谢天谢地,
gcc
足够聪明,可以找到恢复的方法:

 gcc -g main.c dns.c -o build.exe -D WIN -lws2_32 -ldnsapi.dll -w
如果出于某种原因,这不起作用,而您是在Windows上编译,而不是交叉编译,那么这将起作用:

 gcc -g main.c dns.c -o build.exe -D WIN -lws2_32 -lc:\windows\system32\dnsapi.dll -w

您需要将Dnsapi.lib添加到链接器input@RbMm我也发现了。非常感谢。谢谢实际上,我可以使用
-ldnsapi
进行编译,而不必在最后使用
.dll
。@FelisPhasma:在你(删除的)自我回答中键入了什么?不管怎么说,这对我不起作用,所以我详细说明了漫长的道路。
 gcc -g main.c dns.c -o build.exe -D WIN -lws2_32 -ldnsapi.dll -w
 gcc -g main.c dns.c -o build.exe -D WIN -lws2_32 -lc:\windows\system32\dnsapi.dll -w