- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个库项目,我正在努力将其移植到 Linux 中使用 autotools 套件。我对 autotools 很陌生(本周)。我已经了解了其操作的基础知识。我有一个关于如何防止 config.h
的内容被重新定义的问题。
我很惊讶地发现生成的 config.h
文件也没有,1) 将每个宏包装在 #ifndef
中,或者 2)整个文件未包含在标准 #ifndef CONFIG_H
中。
正如我所暗示的,此代码是在 Windows 和 Linux 上构建的。因此,宏 _linux
(我并不是说这是最好的名字,但它到处都在使用)有多种用途,可以将元素引入仅存在于 Linux 中的类中。因此,这将发生
标题.h
#ifndef HEADER1_H
#define HEADER1_H
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#endif
源代码.cxx
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "header.h" // oops, preprocessor gets excited because of redefs
一个简单的解决方案是在生成文件后在 config.h.in
中进行标准的唯一包装。但是,我想知道,有没有更好的方法来处理这个问题?我不是第一个遇到这个问题的人,甚至可能在 configure.ac
中有处理它的方法,但作为这方面的新手,我什至不知道要搜索什么。
最佳答案
我这样做的方法确实是创建一个包装文件(我通常称之为 global.h
),内容如下。
#ifndef MY_PROJECT_GLOBAL_H
#define MY_PROJECT_GLOBAL_H
#include <config.h>
/* Maybe other global definitions… */
#endif
请注意 recommended去#include
的路config.h
文件来自 <config.h>
不是"config.h"
所以它与 VPATH
配合使用效果更好构建。
然后,我项目中的所有源文件#include
这个global.h
标题作为他们的第一个#include
并且不关心config.h
. header 文件不应该 #include
config.h
因为这会导致不良的名称冲突。实际上,如果你坚持这条准则,你的代码也应该在没有 #include
的情况下工作。配置 header 中的守卫。
或者:如何在 header 中使用配置结果?
如果您的 header 需要根据 configure
的结果声明不同的内容脚本,你有很多选择,没有一个是完美的。
对于内部 header ,没有问题。他们只是依赖于宏 #define
d 没有 #include
任何东西。这适用于——如所推荐的——所有源文件#include
(可能间接如上所示)config.h
在任何其他 header 之前。
如果头文件要公开安装,这不是一个很好的解决方案。对于那些使用 Autoconf 的用户来说,情况并没有那么糟糕,尽管即使是那些用户也必须记住要在他们的 configure.ac
中放置哪些检查。文件。对于不使用 Autoconf 的用户来说,这将是非常糟糕的。如果您只有几个开关(例如 Glibc's fature test macros ),可以要求您的用户 #define
他们之前#include
正在处理您的 header ,但如果您需要很多 header ,则这不是一个真正的选择。更不用说您将以这种方式向用户公开大量实现细节。
如果您需要做的只是根据您正在构建的平台进行分支,您可以探测一些预定义的宏,例如 __linux
或 _WIN32
.有 Boost.Predef旨在通过提供更高级别的抽象使这些检查更方便一些的库。该库适用于 C 和 C++,当然,它会为您的项目增加额外的依赖性。
最后,您可以制作一个版本的 config.h
使用特定于您的项目的宏前缀。有 a contribution在 Autoconf 宏存档中,它正是为你做的。一个最小的示例可能如下所示。
AC_PREREQ([2.69])AC_INIT([example-project], [1.0], [bugs@example.org])AC_CONFIG_SRCDIR([example.c])AC_CONFIG_MACRO_DIR([m4])AC_CONFIG_HEADERS([config.h])AX_PREFIX_CONFIG_H([public_config.h], [EXAMPLE_PROJECT], [config.h])AC_PROG_CCAC_OUTPUT
保存为configure.ac
, download ax_prefix_config_h.m4
from the Autoconf macro archive并将其放在子目录中 m4
然后运行 autoreconf && ./configure
.它将创建正常的 config.h
此外public_config.h
在后一个文件中,所有宏都以 EXAMPLE_PROJECT_
为前缀.文件public_config.h
(顺便说一下,它也有 #include
守卫)并且可以安装 #include
d 如果需要,在项目的公共(public)头文件中。
关于linux - 确保包含一次 config.h,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28637542/
任何人都可以详细说明用途是什么(何时使用)asp.net web应用中的web.config,web.config.debug,web.config.release文件?? 最佳答案 它是用于更改调试
我正在尝试创建一个 nuget 包,它将添加一个 DLL 并在正确的配置文件中配置它。该包可用于控制台/表单应用程序或 Web 应用程序,因此我想更新相应的配置文件,app.config 或 web.
已结束。此问题不符合 Stack Overflow guidelines .它目前不接受答案。 关闭 9 年前。 有关您编写的代码问题的问题必须在问题本身中描述具体问题 - 并包含有效代码 以重现它。
我正在开发一个 MVCPortlet。我的 view.jsp 中有一个链接,它调用 liferay 中 portlet 类中的一个方法。 ">Comlex This is the Refahi
我一直在尝试了解如何使用不同的配置文件,我刚刚发现 this link这非常有帮助。唯一的问题是,似乎只有在“发布”解决方案时才会考虑转换,而如果您现在只是进行通用调试或运行,则不会考虑转换。 通常这
我想处理我的 jsx 代码,所以我像这样编写 webpakc.config.js: { test: /\.js$/, loaders: ['react-hot', 'babel-loa
我正在使用 Web.Config 转换将我的应用程序部署到 Azure。我的服务中还有 2 个站点,一个公共(public)网站和一个私有(private) WCF 站点端点。我正在部署multipl
我正在使用 spring security 4.2.5.RELEASE 和 spring 4.3.16.RELEASE我的 XML 配置工作正常,如下所示
config.json 和 config.js 之间有什么区别?我必须同时使用两者吗?我什么时候需要使用其中之一? (https://docs.strongloop.com/display/publi
我运行了 Doctrine 控制台工具: $ php vendor/doctrine/orm/bin/doctrine orm:schema-tool:create --dump-sql 我得到了这个
我正在尝试将 Doctrine ORM 与 Silex 一起使用,但由于缺乏一致的文档,我发现这是一种完全令人沮丧的体验。 当我在控制台运行 vendor/bin/doctrine 时,我得到以下输出
我需要在 web.config 中的多个 WCF 服务中切换出一个 IP 地址。使用 web.config 转换,除了通过 xpath 指定每个地址之外,还有什么方法可以创建搜索和替换语句。例如。对于
我使用来自Ubuntu 14.04的tmux(tmux 1.8)。 我想通过~/.tmux.conf对其进行一些配置。但是无论我在该文件中设置的内容如何,tmux session 都相同。然后,我
嗨,我正在尝试将我的域别名重定向到一个域。 我目前有这个规则 当别名前面没有 www 时它工作得很好.. 我怎么说重定向所有不等于这个域的 谢
我的 Web 配置中有以下 XML,在 Release模式下,我需要根据其子项的名称属性删除 dependentAssembly 部分:assemblyIdentity。我在这里尝试了答案:xdt t
我正在为 web.config 文件寻找一个轻量级的文本编辑器,它具有颜色语法突出显示(如在 Visual Studio 中)。 有什么建议? 最佳答案 您可以使用 Notepad++ .当您使用 w
ImagePicker This plugin allows selection of multiple images from the camera roll
ImagePicker This plugin allows selection of multiple images from the camera roll
如果我有一个 Web 应用程序(有它自己的 web.config )和一个它使用的 .dll 恰好有它自己的 app.config 发生冲突时哪个设置文件会胜出? 最佳答案 不,您不会有任何冲突,因为
问题描述: 我正在尝试在 bash 脚本中使用终止符,但我不断收到一条错误消息,指出没有这样的文件或目录:~/.config/terminator/config .并防止终端在屏幕上弹出。但是,当我在
我是一名优秀的程序员,十分优秀!