“发送”的OS X冲突类型

时间:2015-04-06 19:06:04

标签: c xcode macos clang

我在使用Xcode 6.2编译OS X 10.10上的代码时遇到了一些问题。

  

Apple LLVM 6.0版(clang-600.0.57)(基于LLVM 3.5svn)

     

目标:   x86_64的-苹果darwin14.1.0

我的程序非常简单。头文件header.h

int send();

我在main.c中包含此标题:

#include <stdio.h>
#include "header.h"

int main(int argc, const char * argv[]) {
    return 0;
}

当我尝试编译它时,我得到以下错误:

  

... / header.h:12:5:'send'的冲突类型... / main.c:2:10:In   文件包含在... / main.c:2:   /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/sys/socket.h:574:9:   以前的声明在这里

ssize_t send(int, const void *, size_t, int) __DARWIN_ALIAS_C(send);

为什么我在不包含socket.h的情况下收到此错误?我知道解决方案可以重命名send功能,但我把卡放在桌子上,这是我的作业,我必须在Linux上用上述声明写它。但我想在Mac上编译它。此外,我可以创建一些宏来检查操作系统,并仅在OS X上重命名我的功能。问题是我稍后会得到一些静态库,这个解决方案将无法工作。有什么建议?也许我有一些错误的编译选项或Xcode设置?请帮忙

3 个答案:

答案 0 :(得分:3)

命令行上的Clang工作原理:
clang main.c

问题是xcode的ModuleCache 。这似乎透明地包含了很多东西:D它将以下标志传递给clang:
-fmodules -fmodules-cache-path=/Users/dpich/Library/Developer/Xcode/DerivedData/ModuleCache -fmodules-prune-interval=86400 -fmodules-prune-after=345600

如果在构建设置中禁用它,则编译正常:
enter image description here

答案 1 :(得分:1)

即使您未包含<sys/socket.h>

,也有一些原因导致错误
  1. 如果是编译器错误,可能是因为所做的另一个头文件包括<sys/socket.h>
  2. 如果是链接器错误,那是因为该符号链接到您的可执行文件中,可能是因为它是libc的一部分。无论您是否使用包含或未包含的标题,都会链接符号。
  3. 您最好的选择是为send功能使用不同的名称。

答案 2 :(得分:0)

在做了一些研究后,我认为解决这个问题的最佳方法是在构建设置(link)中将gcc添加到Xcode编译器中,或者使用gcc + Eclipse和C / C ++开发工具(link )。