OS 'send' 的 X 冲突类型
OS X conflict types for 'send'
我在 OS X 10.10 和 Xcode 6.2 上编译代码时遇到一些问题。
Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn)
Target:
x86_64-apple-darwin14.1.0
我的程序很简单。 Header 文件 header.h
:
int send();
我将此 header 包含在 main.c
中:
#include <stdio.h>
#include "header.h"
int main(int argc, const char * argv[]) {
return 0;
}
当我尝试编译它时出现以下错误:
.../header.h:12:5: Conflicting types for 'send' .../main.c:2:10: In
file included from .../main.c:2:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/sys/socket.h:574:9:
Previous declaration is here
ssize_t send(int, const void *, size_t, int) __DARWIN_ALIAS_C(send);
为什么我在不包含 socket.h
的情况下出现此错误?我知道解决方案可以是重命名 send
函数,但我把我的卡片放在 table 上,这是我的作业,我必须只用上面的声明将它写在 Linux 上。但是我想在 Mac 上编译它。我也可以创建一些宏来检查操作系统并仅在 OS X 上重命名我的函数。问题是我稍后会得到一些静态库,这个解决方案将不起作用。有什么建议么?也许我有一些错误的编译选项或 Xcode 设置?请帮助
有几个原因即使您没有包含 <sys/socket.h>
:
也可能会出错
- 如果是编译器错误,可能是因为另一个 header 文件你 did include include
<sys/socket.h>
.
- 如果是链接器错误,那是因为该符号已链接到您的可执行文件中,可能是因为它是 libc 的一部分。无论您是否使用 header 符号,它们都会链接在一起。
您最好的选择是为您的 send
函数使用不同的名称。
经过一些研究后,我认为解决此问题的最佳方法是在构建设置 (link) or use gcc + Eclipse with C/C++ Development Tool (link) 中将 gcc 添加到 Xcode 编译器。
命令行上的 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
如果您在构建设置中禁用它,它可以正常编译:
我在 OS X 10.10 和 Xcode 6.2 上编译代码时遇到一些问题。
Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin14.1.0
我的程序很简单。 Header 文件 header.h
:
int send();
我将此 header 包含在 main.c
中:
#include <stdio.h>
#include "header.h"
int main(int argc, const char * argv[]) {
return 0;
}
当我尝试编译它时出现以下错误:
.../header.h:12:5: Conflicting types for 'send' .../main.c:2:10: In file included from .../main.c:2: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/sys/socket.h:574:9: Previous declaration is here
ssize_t send(int, const void *, size_t, int) __DARWIN_ALIAS_C(send);
为什么我在不包含 socket.h
的情况下出现此错误?我知道解决方案可以是重命名 send
函数,但我把我的卡片放在 table 上,这是我的作业,我必须只用上面的声明将它写在 Linux 上。但是我想在 Mac 上编译它。我也可以创建一些宏来检查操作系统并仅在 OS X 上重命名我的函数。问题是我稍后会得到一些静态库,这个解决方案将不起作用。有什么建议么?也许我有一些错误的编译选项或 Xcode 设置?请帮助
有几个原因即使您没有包含 <sys/socket.h>
:
- 如果是编译器错误,可能是因为另一个 header 文件你 did include include
<sys/socket.h>
. - 如果是链接器错误,那是因为该符号已链接到您的可执行文件中,可能是因为它是 libc 的一部分。无论您是否使用 header 符号,它们都会链接在一起。
您最好的选择是为您的 send
函数使用不同的名称。
经过一些研究后,我认为解决此问题的最佳方法是在构建设置 (link) or use gcc + Eclipse with C/C++ Development Tool (link) 中将 gcc 添加到 Xcode 编译器。
命令行上的 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
如果您在构建设置中禁用它,它可以正常编译: