如何在 C++ Autotools 项目中禁用 C 编译器

2023-12-08

我正处于向 C++ 库添加 Autotools 支持的早期阶段。此时我正在跑步autoreconf具有以下配置。

$ cat Makefile.am
AUTOMAKE_OPTIONS = foreign
bin_PROGRAMS=cryptest

$ cat configure.ac
AC_INIT(Crypto++, 6.0, http://www.cryptopp.com/wiki/Bug_Report)
AM_INIT_AUTOMAKE
AC_PROG_CXX
AC_CONFIG_FILES([Makefile])

它正在生产:

$ autoreconf --install --force
/usr/share/automake-1.15/am/depend2.am: error: am__fastdepCC does not appear in AM_CONDITIONAL
/usr/share/automake-1.15/am/depend2.am:   The usual way to define 'am__fastdepCC' is to add 'AC_PROG_CC'
/usr/share/automake-1.15/am/depend2.am:   to 'configure.ac' and run 'aclocal' and 'autoconf' again
Makefile.am: error: C source seen but 'CC' is undefined
Makefile.am:   The usual way to define 'CC' is to add 'AC_PROG_CC'
Makefile.am:   to 'configure.ac' and run 'autoconf' again.
autoreconf: automake failed with exit status: 1

我正在努力解决error: C source seen but 'CC' is undefined先提出问题。

基于邮件列表阅读的传统智慧是添加AC_PROG_CC解决该问题。我真的不想解决 C++ 标志会给 C 编译器带来的问题,尤其是在 IBM 的 xlc 和 Sun 的 cc 等编译器上。鉴于 GNU 完全取决于用户的选择,这似乎也是错误的。

我如何告诉 Autotools 该项目是 C++ 项目,并且它不应该使用 C 或 C 编译器执行任何操作?


以下是它引起的一些问题。

$ egrep 'CC|CFLAGS' Makefile
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
        $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
...
LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
        $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
        $(AM_CFLAGS) $(CFLAGS)
...
CCLD = $(CC)
...
LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
        $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \

$ autoreconf --version
autoreconf (GNU Autoconf) 2.69

$ autoconf --version
autoconf (GNU Autoconf) 2.69

$ automake --version
automake (GNU automake) 1.15

当你定义一个像这样的程序时bin_PROGRAMS=cryptest, automake 寻找cryptest_SOURCES找出 cryptest 的源文件是什么。如果你不定义cryptest_SOURCES,automake 将通过在程序名称后附加“.c”(默认情况下)来自动生成一个程序,例如就像你已经定义了一样cryptest_SOURCES=cryptest.c。要覆盖默认值,您可以显式定义每个程序的源,例如cryptest_SOURCES=cryptest.cpp,或者你可以定义AM_DEFAULT_SOURCE_EXT=.cpp使所有自动生成的源文件名以“.cpp”而不是“.c”结尾。

当然,如果您的源名称与程序名称不匹配,或者有多个源(包括您想要通过“make dist”包含的任何头文件),那么您无论如何都需要显式定义,例如cryptest_SOURCES=cryptest.cpp cryptest-part2.cpp cryptest.h.

See: https://www.gnu.org/software/automake/manual/automake.html#Default-_005fSOURCES

编辑添加:假设您将使用 AC 宏来测试编译器的功能,您将需要调用AC_LANG([C++])首先(在 AC_PROG_CXX 之后)告诉 autoconf 它应该测试 C++ 编译器,而不是 C 编译器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 C++ Autotools 项目中禁用 C 编译器 的相关文章

随机推荐

  • mysql中为什么null<>null=null

    我正在学习 MySql 教程 并且完成了以下查询 mysql gt select null lt gt null null lt gt null NULL 我不明白为什么结果是 Null 我认为它需要是 1 或 0 基于其他比较运算符的结果
  • Aws Api Gateway 集成请求 如何将属性附加到请求正文?

    我想在将请求正文和查询字符串参数发送到 lambda 之前将其组合起来 假设我在 Lambda 中有一个实体 如下所示 Class Person private String firstName private String lastNam
  • 在 Pandas 中创建空数据框并指定列类型

    我正在尝试创建一个带有索引的空数据框并指定列类型 我这样做的方式如下 df pd DataFrame index pbp columns contract state and county code state county startin
  • Android:SDK和库项目有什么区别

    对于像facebook这样的应用程序 他们提供了SDK 我使用了许多第三方库来满足不同的需求 这两种情况有什么区别 这是作为库或 sdk 捆绑的代码 A Library是一段代码 您可以从自己的代码中调用它 以帮助您更快 更轻松地完成任务
  • 我可以让Shiny在更新之前等待numericInput更长的时间吗?

    在我的 Shiny 应用程序中 有一些numericInput and selectInput Shiny 在键入期间更新输出 尤其是当用户在 numericInput 中键入速度较慢时 sumbitButton你能习惯停止自动更新吗 但我
  • 实体框架:当数据库更改时如何刷新模型?

    如果您从数据库构建 edmx 文件 然后数据库发生更改 如何让模型接受更改 您是否删除整个模型并重新生成 或者您可以检测到更改吗 我看到一篇文章提到 更新您的模型 rt edmx 文件上的鼠标命令 但我没有看到它 更新您的 edmx 以反映
  • com.google.firebase.FirebaseException:发生内部错误。 [7:]

    我曾经创建帐户并使用 firebase 连接到我的应用程序 但很快当我断开连接时 我无法创建帐户 1 小时后 我设法创建了一个帐户 当我断开连接以查看问题是否解决时 我意识到它仍然存在 通过做task getException 如果帐户创建
  • 使用 VBA Excel 的 SQL 数据透视函数文本文件数据库

    我们在工作中无法访问 SQL Server 因此我必须在 Excel VBA 中设计一个应用程序并使用文本文件 CSV 来存储数据 我查询数据 加入 CSV 没有问题 但我想使用 SQL Pivot Unpivot 语句将其中一列转置为行
  • 处理 RSelenium 错误消息

    目前正在抓取一个页面 该页面可以具有可变数量的元素 并且有时还使用不同的选择器来格式化相同的数据元素 目前正在尝试使用一些 tryCatch 代码忽略 RSelenium 引发的错误 但当指定的元素不在页面上时仍然会停止 result lt
  • bouncycastle 库使用哪个 OpenSSL 版本?

    我正在 Android 中使用 BouncyCastle 库进行 OpenSSL 加密 我的库版本是1 45 我想知道库中使用的是 OpenSSL 版本 任何人都可以帮助我 我怎样才能找到它 BouncyCastle 用 java 实现 它
  • 在悬停时添加底部边框,仅限 CSS

    如何使一条线在悬停时仅出现在链接图像的底部 我可以在悬停时显示内部边框 但我只想显示 border bottom 这是我到目前为止所拥有的 即使它使用轮廓属性而不是边框 links a img links a border none flo
  • 限制 Wagtail Steamfield 中特定 DocumentChooserBlock() 块的文件类型

    我试图限制 wagtail 流字段块内特定 DocumentChooserBlock 的查询结果 我已经知道您可以使用以下方法限制页面类型的文档选择器的文件类型hooks 但我想避免限制页面范围内可能的文件类型 以防我需要它们用于其他 St
  • boost::需要 RTTI 吗?

    在 Boost 网站上 我没有找到有关 boost any 的使用或 RTTI 的信息 我在一些地方读到这是一个要求 但后来我构建了一个简单的测试项目 并且它可以在使用和不使用 RTTI 的情况下构建 那么 由于 RTTI 的性能和内存问题
  • 如何在渐变形状上获得色标?编程语言

    如何在形状上获得色标 我正在创建一个树流程图 我想给它们一个渐变 我还想按百分比更改渐变 所以我希望一个节点的两个颜色停止点都为 50 所以到目前为止我所拥有的给出渐变图案的代码是 QNode Shapes 1 Fill TwoColorG
  • PHP 会话在服务器中不起作用

    我正在用 php 设计一个网站 完成后我将内容上传到服务器中 该页面在本地主机中运行良好 但上传后 页面甚至无法加载 在每个页面的顶部我都包含一个名为startsession php 的页面 该页面内容如下 session start he
  • 使用 EF Core 级联删除

    我目前在使用 EF Core 时遇到一些问题 我有一些需要删除的数据 并且我正在努力了解 Fluent API 的工作原理 确切地说是关于 OnDelete 功能 考虑经典的博客 帖子场景微软自己的网站 我想知道什么实体 到底是OnDele
  • ajax调用jquery函数后无法正常工作

    标题 照片 php cmdclose click function var id this id post cmddel php id id setTimeout function
  • 根据日期范围按日/月/周分组

    这是参考这个question 这是我的数据集 rating 4 ceatedAt ISODate 2016 08 08T15 32 41 262 0000 rating 3 createdAt ISODate 2016 08 08T15 3
  • 将 rvmsudo 与 Capistrano 结合使用

    我正在尝试设置 capistrano 来轻松部署我的 Rails3 应用程序 我对 Rails 还很陌生 除了我试图重新启动独立的乘客服务器之外 一切都正常工作 我在同一台服务器上运行redmine 所以我遵循http blog phusi
  • 如何在 C++ Autotools 项目中禁用 C 编译器

    我正处于向 C 库添加 Autotools 支持的早期阶段 此时我正在跑步autoreconf具有以下配置 cat Makefile am AUTOMAKE OPTIONS foreign bin PROGRAMS cryptest cat