版权声明:转载请注明出处 https://blog.csdn.net/weixin_39540568/article/details/87889845
================================20180410====================================
今天在跨平台移植原来windows平台的软件到solaris时候,编译出现如下错误:
写了个测试代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
int main(int argc, char *argv[])
{
struct in_addr addr1,addr2;
ulong l1,l2;
l1= inet_addr("192.168.0.74");
l2 = inet_addr("211.100.21.179");
memcpy(&addr1, &l1, 4);
memcpy(&addr2, &l2, 4);
printf("%s \n", inet_ntoa(addr1));
printf("%s\n", inet_ntoa(addr1));
printf("%s\n", inet_ntoa(addr2));
return 0;
}
上述代码在centos系统上直接g++编译就能正常通过,并且运行无误,但是在solaris系统上编译的时候却总是在链接的时候找不到对应函数的实现,可以明确的是这两个都在arpa/inet.h中进行了定义。折腾了两个小时之后(去查找为什么之前的在solaris上的程序能够正常编译通过),终于在如下的博客中找到了正解。unix中应该是将这些实现以动态库so文件的形式存在,所以编译的时候需要加入动态链接库,此例中需要加入的是-lnsl,类似进行socket编程的话要加入-lsocket进行动态库的连接。
后面可以仔细研究一下unix下和linux下socket编程具体的一个差异。