免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2419 | 回复: 8
打印 上一主题 下一主题

求助 跨平台编程,区分操作系统的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-06-23 22:56 |只看该作者 |倒序浏览
#ifdef LINUX
#endif
可以这样写吗?
为什么Gcc无法通过
lzcxh 该用户已被删除
2 [报告]
发表于 2006-06-23 23:25 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
3 [报告]
发表于 2006-06-23 23:40 |只看该作者
原帖由 wjfree 于 2006-6-23 22:56 发表
#ifdef LINUX
#endif
可以这样写吗?
为什么Gcc无法通过

说明操作系统,把报错贴出来.如果程序不是很大也贴出来,大家共同学习

论坛徽章:
0
4 [报告]
发表于 2006-06-24 09:51 |只看该作者
在configure.ac里面检测吧?
然后可以是-DXXX也可以输出到config.h里面。

最后才能配合#ifndef XXX之类的进行判断。

论坛徽章:
0
5 [报告]
发表于 2006-06-24 13:30 |只看该作者
  1. # include <stdio.h>
  2. # ifndef WIN32
  3. # include <sys/socket.h>
  4. # include <unistd.h>
  5. # include <netinet/in.h>
  6. # include <arpa/inet.h>
  7. # include <pthread.h>
  8. # define  closesocket(a)  close(a)
  9. # else
  10. # include <winsock2.h>
  11. # endif
  12. # define  MAXBUF  512
  13. # define  PORT 2222

  14. void rcv();                        /*后台接收消息的函数 */
  15. void snd();                /*发送消息的函数*/

  16. /*简介:该程序是一个跨平台的一个简单的基于UDP协议聊天工具
  17.   功能:主线程:发送消息
  18.             子线程:接收消息
  19.   作者:wjfree
  20.   使用:运行后发送消息:IP +空格+ Message
  21.   编译:linux 下:gcc ./chatlin.c -lpthread -o chat
  22.           win下:在lcc下添加工程,编译
  23. */
  24. int main ()
  25. {
  26. # ifdef WIN32
  27.         WSADATA                        wsaData;
  28.         WORD wVersionRequested = MAKEWORD( 2, 2 );
  29.         int err = WSAStartup( wVersionRequested, &wsaData );
  30.         HANDLE      hThread;
  31.         DWORD       dwThreadId;
  32.         hThread = CreateThread(NULL,0,rcv,NULL,0,&dwThreadId);
  33.         snd();
  34.         WSACleanup();
  35. # else
  36.         pthread_t id;
  37.         int ret;
  38.         ret = pthread_create(&id,NULL,(void *)rcv,NULL);        /*创建一个线程*/
  39.         snd();
  40. # endif
  41.         return 0;
  42. }

  43. /*函数:snd()
  44.   功能:用scanf()函数接收ip地址和消息内容,发到对应的IP上
  45.   作者:wjfree
  46. */
  47. void snd()
  48. {

  49.         struct     sockaddr_in name;
  50.         int        sock;
  51.         name.sin_family = PF_INET;
  52.         name.sin_port = htons(PORT);
  53.         sock = socket(PF_INET, SOCK_DGRAM,0);
  54.         if (sock < 0)
  55.                 {
  56.                         printf("make socket error\n");
  57.                         return;
  58.                 }
  59.         while(1)
  60.                 {
  61.                         char bufloc[MAXBUF];
  62.                         char ipaddr[17];
  63.                         scanf("%s%s" , ipaddr, bufloc);
  64.                         int i = name.sin_addr.s_addr = inet_addr(ipaddr);
  65.                         if (i == -1)
  66.                                 {
  67.                                         printf("IP address format error!\n");
  68.                                 }
  69.                         else
  70.                                 {
  71.                                         int i = sendto(sock, bufloc, strlen(bufloc), 0, (struct sockaddr *)&name, sizeof(name));
  72.                                         if (i < 0)
  73.                                                 printf("Can not send the message to %s\n", ipaddr);
  74.                                 }

  75.                 }
  76.                 closesocket(sock);
  77. }

  78. /*函数:snd()
  79.   功能:接收消息并显示在终端
  80.   作者:wjfree
  81. */
  82. void rcv()
  83. {
  84.          struct sockaddr_in RecvAddr;
  85.          struct sockaddr_in SenderAddr;
  86.          int    sock;
  87.          sock = socket(AF_INET, SOCK_DGRAM, 0);
  88.          RecvAddr.sin_family = AF_INET;
  89.            RecvAddr.sin_port = htons(PORT);
  90.            RecvAddr.sin_addr.s_addr = htonl(INADDR_ANY);
  91.          bind(sock, (struct sockaddr *) &RecvAddr, sizeof(RecvAddr));
  92.          printf("Receiving datagrams...\n");
  93.            while(1)
  94.                   {
  95.                          int size = sizeof(SenderAddr);
  96.                           char RecvBuf[MAXBUF];
  97.                           int  BufLen = MAXBUF;
  98.                           int i = recvfrom(sock,
  99.                             RecvBuf,
  100.                             BufLen,
  101.                             0,
  102.                             (struct sockaddr *)&SenderAddr,
  103.                             &size);
  104.                          RecvBuf[i] = 0;
  105.                          printf("%s: %s\n", inet_ntoa(SenderAddr.sin_addr),RecvBuf);
  106.                   }
  107.   closesocket(sock);
  108. }
复制代码


这是代码,一个小聊天程序在linux+gcc和win+lcc可以编译,但是将# ifndef WIN32改成# ifdef LINUX 就不行了

论坛徽章:
0
6 [报告]
发表于 2006-06-24 13:32 |只看该作者
加上 -DLINUX就好了

论坛徽章:
0
7 [报告]
发表于 2006-06-24 14:09 |只看该作者
原帖由 wjfree 于 2006-6-24 13:32 发表
加上 -DLINUX就好了

跨平台编程,最好在makefile里面先进行OS的检测,然后引用相关的事先定义在另一个文件里的该OS的环境变量。
Linux:
        ln -s linux.env make.env
        ln -s ...........
BSD;
      ln -s bsd.en make.env
      ......................

在os.env文件里定义该OS的很多环境变量以及cflags&dlfags

论坛徽章:
0
8 [报告]
发表于 2006-06-24 22:28 |只看该作者
谢谢,我试一下

论坛徽章:
0
9 [报告]
发表于 2006-06-26 09:39 |只看该作者
uname -s
-s
Print the name of this implementation of the operating system.
我原来这么做过,根据uname -s 的命令返回获取操作系统,如HP-UX LINUX 等等,
然后根据操作系统的不同,做具体的编译。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP