在 OS X 和 Linux 下使用 automake 构建 C
Building C with automake under OS X and Linux
目前我正在基于澳大利亚 (GitHub) 的 Serval 项目在 C 中为延迟容忍网络编写一个 RPC 系统。
主要是我在 macOS El Capitan 上开发,一切正常。但是我的代码在 macOS 和 Linux 上运行有点重要。但是 Linux 制造麻烦。
我选择 automake 作为我的构建系统,因为这是我至少有一点经验的唯一系统。我也尝试过 CMake,但收效甚微。
我现在的问题是在 macOS 上一切正常。但是在 Linux (Debian) 上没有编译。 autoreconf
生成一个没有错误的配置脚本,configure
生成一个没有错误的 Makefile。但是 make
会产生很多错误。如果我说很多,我的意思是很多(大约 75.000 行)。
第一期如下:
In file included
from /usr/include/x86_64-linux-gnu/sys/types.h:29:0,
from /usr/local/include/curl/curlbuild.h:131,
from /usr/local/include/curl/curl.h:34,
from rpc.h:1,
from main.c:1:
/usr/include/x86_64-linux-gnu/bits/types.h:30:1: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘typedef’
typedef unsigned char __u_char;
我四处搜索,发现有人说这种类型的错误来自用户代码的某个地方,可能是缺少 ;
或类似的错误。但我仔细检查了一切。缺少 ;
在 macOS 上也是一个问题。
我的代码可以在我的 Github repo. 中找到,请使用 dev
分支。
在这一点上,repo 有点恶心而且一点也不干净。等一切都运行.
我再清理
感谢您的帮助:)
这是因为serval/general/features.h
。这是怎么回事:
curl/curl.h
包含 curlbuild.h
,其中包含 sys/types.h
.
sys/types.h
包括 features.h
(期望来自 glibc 的那个),其中包括 sys/cdefs.h
,它定义 __BEGIN_CDECL
(什么都没有,因为这是 C,不是C++.)
sys/types.h
开头(剪掉不需要的东西)
__BEGIN_CDECL
typedef unsigned char __u_char;
因为__BEGIN_CDECL
没有定义,所以出错。
避免在命令行中使用 -Iserval/general
并包含具有完整相对路径的文件,这样应该没问题。
目前我正在基于澳大利亚 (GitHub) 的 Serval 项目在 C 中为延迟容忍网络编写一个 RPC 系统。
主要是我在 macOS El Capitan 上开发,一切正常。但是我的代码在 macOS 和 Linux 上运行有点重要。但是 Linux 制造麻烦。
我选择 automake 作为我的构建系统,因为这是我至少有一点经验的唯一系统。我也尝试过 CMake,但收效甚微。
我现在的问题是在 macOS 上一切正常。但是在 Linux (Debian) 上没有编译。 autoreconf
生成一个没有错误的配置脚本,configure
生成一个没有错误的 Makefile。但是 make
会产生很多错误。如果我说很多,我的意思是很多(大约 75.000 行)。
第一期如下:
In file included
from /usr/include/x86_64-linux-gnu/sys/types.h:29:0,
from /usr/local/include/curl/curlbuild.h:131,
from /usr/local/include/curl/curl.h:34,
from rpc.h:1,
from main.c:1:
/usr/include/x86_64-linux-gnu/bits/types.h:30:1: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘typedef’
typedef unsigned char __u_char;
我四处搜索,发现有人说这种类型的错误来自用户代码的某个地方,可能是缺少 ;
或类似的错误。但我仔细检查了一切。缺少 ;
在 macOS 上也是一个问题。
我的代码可以在我的 Github repo. 中找到,请使用 dev
分支。
在这一点上,repo 有点恶心而且一点也不干净。等一切都运行.
感谢您的帮助:)
这是因为serval/general/features.h
。这是怎么回事:
curl/curl.h
包含 curlbuild.h
,其中包含 sys/types.h
.
sys/types.h
包括 features.h
(期望来自 glibc 的那个),其中包括 sys/cdefs.h
,它定义 __BEGIN_CDECL
(什么都没有,因为这是 C,不是C++.)
sys/types.h
开头(剪掉不需要的东西)
__BEGIN_CDECL
typedef unsigned char __u_char;
因为__BEGIN_CDECL
没有定义,所以出错。
避免在命令行中使用 -Iserval/general
并包含具有完整相对路径的文件,这样应该没问题。