c - 使用带有文件扩展名 .r 的自动工具作为标题,而不是 ratfor 而是 C 编程
问题描述
我正在使用 Axel T Schreiner 所著的http://www.cs.rit.edu/~ats/books/ooc.pdf “ANSI-C 中的面向对象编程”一书。他使用的 makefile 和编译一样工作正常。所以 C 编译器和 make 实用程序使用 .r 文件作为包含文件没有问题。(.r
代表为了练习信息隐藏。)
现在我已经进步到我想手动编写代码的地步了。我通常使用自动工具没有问题。对于.r
文件,我遇到了问题。该命令autreconf -iv
返回以下错误:
autoreconf: Entering directory `.'
autoreconf: configure.ac: not using Gettext
autoreconf: ...............................
..... (snip)
autoreconf: running: /usr/bin/autoheader
autoreconf: running: automake --add-missing --copy --no-force
Makefile.am: error: Ratfor source seen but 'F77' is undefined
Makefile.am: The usual way to define 'F77' is to add 'AC_PROG_F77'
Makefile.am: to 'configure.ac' and run 'autoconf' again.
autoreconf: automake failed with exit status: 1
我希望 autoheader/autoreconf 不将.r
文件标记为源文件,而只是将它们用作 C 包含文件,只是另一个头文件。
我搜索了谷歌,但主要发现了 autoheader 的手册,据我所知,这没有帮助。
有没有办法让 autotools 将 .r 文件(或任何其他后缀)视为 C 代码而不是 ratfor 源?
解决方案
确实,.h
头文件的后缀只是一个约定,而不是规则。事实上,头文件作为源文件的一个区分类别的整个想法基本上是传统的,即使它是标准本身遵守的约定。尽管如此,这些都是非常强大的约定。
Automake 通过依赖文件命名和组织来遵守此类约定来实现其许多自动化行为。特别是,它通过文件名后缀识别源文件类型。据我所知,这样做的规则是不可配置的。使用标准文件命名约定是使用 Autotools 的成本之一。
但是可以稍微改变一下这个规则。请特别注意,在*_SOURCES
变量中列出头文件的唯一目的是确保它们被打包到(源)发行版中。Automake 不依赖于任何其他目的,特别是它不依赖于依赖跟踪。但是还有另一种方法可以告诉 Automake 应该进入分发的文件:将它们列在EXTRA_DIST
变量的值中。因此,.r
从变量中删除文件*_SOURCES
并将它们放入EXTRA_DIST
将解决问题。
示例:
测试.c
#include "test.r"
int x = 1;
int main(void) {
return x;
}
测试.r
#ifndef TEST_R
#define TEST_R
extern int x;
#endif
生成文件.am
bin_PROGRAMS = test
test_SOURCES = test.c
EXTRA_DIST = test.r
(config.ac 省略——非说明性的)
推荐阅读
- node.js - 为什么我们需要 node 应用程序根目录的 package.json 中的 main 属性,如果它是为了告诉包和模块的入口点?
- python - 如何计算子目录中的文件数?
- kubernetes-ingress - GKE 上的一个 GCE 入口导致另一个 GCE 入口为默认后端提供服务
- sql - SQL Server 存储过程选择参数传递的特定列,并检查其他约束
- ruby - 为什么我在明显存在的对象上得到“nil:NilClass 的未定义方法”?
- perl - 如何替换 Perl 已弃用的 find.pl
- c# - Excel.Workbooks.Open 失败,HRESULT: 0x800A03EC 在开发环境中
- sql-server - 用 ORDER BY 子句替换 UPDATE 语句
- php - 生产服务器上的作曲家包问题 - Laravel 项目
- sql - 数据定义语言 (DDL) 查询 SQL