gpt4 book ai didi

linux - 确保包含一次 config.h

转载 作者:太空狗 更新时间:2023-10-29 11:37:11 26 4
gpt4 key购买 nike

我有一个库项目,我正在努力将其移植到 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 中的守卫。


关于 OP 评论的更新

或者:如何在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com