【问题标题】:Optional source code generation using Autotools (C/C++)?使用 Autotools (C/C++) 生成可选的源代码?
【发布时间】:2014-07-24 07:41:46
【问题描述】:

我有一个名为api.h 的头文件,其中包含我的库的公共函数。我希望函数void func_xxx(); 仅在用户使用./configure --enable-xxx 启用它时在api.h 中声明。这可能吗?理想情况下,我不想为此使用#ifdef?我知道如何在我的configure.ac 脚​​本中实现--enable-xxx 标志,但如果使用--enable-xxx,我不知道如何将函数声明添加到api.h

感谢您的帮助

【问题讨论】:

  • 如果你不介意我问,你为什么要避免#ifdef
  • 我的目标是用户不需要使用 -DHAVE_XXX 来编译他的程序。
  • 但他没有。 autotools 会解决这个问题。除非我误解了你 =)
  • 感谢您的cmets,我会仔细研究一下。
  • 我看到如果我在 api.h 中包含 config.h 可以实现我想要的吗? (但通常不建议这样做!?)。除此之外,我仍然不知道该怎么做,即如果 program.c 包含 api.h 并使用 func_xxx(),则 gcc -c program.c 失败。

标签: c++ c makefile autotools


【解决方案1】:

您想要实现的不是好习惯,因为正如您所提到的,您需要#ifpreprocessor 宏,将config.h 拖到公共界面,因此必须安装它。配置文件不是要安装的。

我建议你在运行时这样做,这是在诸如 API design for C++ 之类的书中建议的做法,顺便说一句,非常推荐阅读:

bool isFuncXXXEnabled();
void funcxxx();

您的代码:

if (isFuncXXXEnabled()) {
}
else {
}

在您的 .cpp 文件中,您可以禁用函数主体,因为 `config.h 不会在公共接口中公开。

【讨论】:

  • 好答案。除了“不打算安装配置文件”之外,这样做的一个原因是,如果您的api.h 可以根据某人配置库的方式进行更改,那么在一个系统上运行良好的程序可能无法编译另一个(或者,如果它们是通过包管理器作为二进制包安装的,它们可能会崩溃!)
  • 嗯,这是真的,但我认为这里有一个权衡。标准解决方案是,AFAIK。在不依赖配置的情况下,您应该在生成时执行更复杂的机器,例如从 api.h.in 机器生成 api.h 文件,而不使用#ifdefs。你可以这样做替换 autoconf 变量或类似的,但我不知道这个想法会有多好。
  • 感谢您的回答,它将我的 API 与用户代码完全分离。另一个不太理想的解决方案是使用来自gnu.org/software/autoconf-archive/ax_prefix_config_h.html 的 ax_prefix_config_h.m4 宏创建一个可安装的配置文件
  • “但我不知道这个主意会有多好。”。这不是一个好主意,例如如果我使用编译器 A 构建我的库,而用户使用编译器 B 编译他的代码,那么他的代码可能会中断,因为 api.h 是专门为编译器 A 构建的(例如 api.h 可能使用编译器 A 的非标准扩展)。跨度>
猜你喜欢
  • 2013-06-24
  • 1970-01-01
  • 2013-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-01
  • 1970-01-01
  • 2010-10-14
相关资源
最近更新 更多