如何使用自动工具设置包含路径

2024-01-04

我正在开发一个 C++ 项目,该项目使用autoconf & automake,我正在努力正确设置包含路径*CPPFLAGS。我读了大约3个小时的文档,但我还没有弄清楚。我不是在寻找黑客,而是在寻找正确的方法来做到这一点。这是我的难题。

据我所知,包含路径有 3 个完全不同的来源:

  1. 必须与我的包一起安装的外部库,这些库由configure --with-XXX=<PATH>.
  2. 在我的包中,一些源文件使用#include <file.h>即使当file.h是包的一部分,因此要编译它们,我必须正确设置包含路径。 (请注意,无法编辑所有这些文件。)
  3. 异想天开的(或非异想天开的)标准指定必须允许用户指定他们自己的(额外的)包含路径。也就是说,我不应该设置CPPFLAGS at all.

在我当前的设置中:

  • 内部设置类型1路径configure.ac by AC_SUBST(CPPFLAGS, "$CPPFLAGS -I<path>").
  • 里面设置了2类路径Makefile.am by test_CPPFLAGS = -I<path>.
  • 无法设置类型 3。更准确地说,如果用户设置CPPFLAGS跑步前make,这会覆盖类型 1 设置,导致编译失败。当然,用户可以尝试使用CXXFLAGS相反,但那个有不同的用途(记住,我要求的是正确的方法来做到这一点,而不是黑客)。

我尝试通过使用设置类型 1 路径来解决此问题AM_CPPFLAGS inside configure.ac。 (仅供参考:如果您设置AM_CPPFLAGS代替CPPFLAGS,但您仍然需要运行一些检查,例如AC_CHECK_HEADERS,需要临时设置CPPFLAGS然后将其恢复以使检查正常工作;这是解释的here http://www.bioinf.uni-freiburg.de/~mmann/HowTo/automake.html#extLibCheck.) 这释放了CPPFLAGS对于类型 3 路径,但不幸的是编译失败,因为Makefile-s 产生的configure只会使用AM_CPPFLAGS如果没有专门的<target>_CPPFLAGS存在。因此,如果test_CPPFLAGS存在类型 2 路径,编译test将会失败,因为它没有获得类型 1 路径。

修复方法是在内部指定Makefile.am总是使用AM_CPPFLAGS。但这是“按书本规定”吗?我可以以全局方式执行此操作,还是必须编辑每一个target_CPPFLAGS?还有另一个“正确”的解决方案吗?


我知道很难从自动工具手册中得到直接答案。有一些很好的从头到尾的教程here https://autotools.io/ and here http://www.freesoftwaremagazine.com/books/autotools_a_guide_to_autoconf_automake_libtool.

没有特定于包的标准变量*CPPFLAGS在自动配置中。configure可以调用CPPFLAGS=...,automake 会添加这个CPPFLAGS相关的 makefile 规则 - 搜索CPPFLAGS in a Makefile.in文件作为示例。出于这个原因,我建议你not将此变量用于其他用途。

添加标志Makefile.am to the AM_CPPFLAGS变量(所有预处理器调用的默认值)或覆盖单个预处理器标志target_CPPFLAGS。在第 3 方库的示例中,最好使用如下名称:FOO_CPPFLAGS保存预处理器选项,例如

FOO_CPPFLAGS="-I${FOO_DIR}/include -DFOO_BAR=1"
...
AC_SUBST(FOO_CPPFLAGS)

并在Makefile.am :

AM_CPPFLAGS = -I$(top_srcdir) $(FOO_CPPFLAGS)
# or:
target_CPPFLAGS = -I$(top_srcdir) $(FOO_CPPFLAGS)

The top_srcdir变量定义为configure- 我用它来说明第二种情况。假设你有file.h在另一个目录中other,在顶级目录下。-I$(top_srcdir)允许您将其包含为<other/file.h>。或者,-I$(top_srcdir)/other将允许您将其包含为<file.h>.

另一个有用的预设变量 http://www.gnu.org/software/autoconf/manual/autoconf.html#Preset-Output-Variables is srcdir- 当前目录。-I$(srcdir)被添加到AM_CPPFLAGS 默认情况下. So if file.h位于当前目录中,您可以将其包含在<file.h>甚至"file.h". If other是一个“兄弟”目录,-I$(srcdir)/..将允许你包括<other/file.h>, and -I$(srcdir)/../other会允许<file.h>.


我还要补充一点,一些软件包安装了 pkg-config.pc文件。如果 pkg-config 的安装设置为搜索正确的目录,您可能会发现PKG_CHECK_MODULES宏非常有用。

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

如何使用自动工具设置包含路径 的相关文章

  • automake环境变量条件

    我有一个文件 Makefile am 我用来生成 Makefile 在生成的 Makefile 中我想要类似的内容 ifndef SOURCECODEPATH SOURCECODEPATH home root source code pat
  • 考虑到危险,为什么项目要使用 -I include 开关?

    阅读细则 I在 GCC 中切换时 我相当震惊地发现在命令行上使用它会覆盖系统包含 来自预处理器文档 https gcc gnu org onlinedocs cpp Invocation html Invocation 您可以使用 I覆盖系
  • 如何#include 第三方库

    我已经构建并安装了一个名为的库OhNet http wiki openhome org wiki OhNet After make install框架对应的头文件已经安装在下面usr local include ohNet 现在我想在我的
  • 使用 Libtool 将静态库强制链接到共享库

    我有一个图书馆 libfoo 编译后的使用libtool分成两个对象 libfoo a 和 libfoo so 我必须创造 使用libtool另外 另一个图书馆 libbar 这将是一个包含所有 libfoo 代码的共享库 libbar s
  • Autoconf:如何将安装路径获取到config.h中

    我的程序需要在运行时加载一些文件 这些文件将安装到指定的任何文件夹中 configure datadir somewhere 由于我的程序需要在运行时知道该文件夹的位置 因此我需要在某处 define 一个符号 以便 C 代码可以以字符串形
  • 当 .h 文件明显可用时,为什么 autoconf 没有通过 AC_CHECK_HEADER 测试?

    我花了很长时间让 autoconf 检查特定头文件是否存在 我们将标头依赖项称为 inky h 并假设 inky 是一个 单独 安装的库 前缀设置为 usr local 这会将 inky h 放入 usr local inky inky h
  • Automake 变量来整理 Makefile.am

    我有一个目录 src 包含所有源文件 bin 用来在运行 make 命令后存储所有二进制文件 该目录如下所示 BuildDirectory src bin configure Makefile am configure ac 现在在 Mak
  • Autoconf 和 A​​utotools 的替代品? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何安装和使用libtool共享库(.lo文件)?

    所以在我运行 libtool 并得到一个libfoo lo and foo o来自我的库源的文件 如何转换libfoo lo文件到一个普通的Linux共享库中 比如libfoo so 1 0 0这样我就可以在我的目标系统上安装并链接到它 从
  • c_cpp_properties.json 中的 includePath 在 C 的 VSCode 中不起作用

    我正在 Ubuntu 18 04 上使用 C C 扩展的 VSCode 进行工作 我试图包含 gmodule h 并且它引发了错误gmodule h No such file or directory主文件第 2 行第 10 个字符 因此
  • PHP 包含绝对路径

    我的网站上有一个名为 basePath 的变量 其设置为 basePath Systems dgw 我在所有 css js 和图像标签上使用它 为了更好的可见性而缩短 我对这些包含没有任何问题 它们在我所在的任何文件和文件夹中都可以正常工作
  • 将 autoconf 配置为具有 --with 选项来自定义构建

    我对 autoconf 和 automake 的工作原理有一个非常基本的了解 这是从各种教程中收集的 但是 由于我希望我的库在构建过程中保持灵活性 因此他们需要 with FEATURE and without FEATURE其他程序中常见
  • 如何获取 autoconf configure.ac 中顶级构建目录的绝对路径?

    我正在开发一个项目 该项目需要一个具有自己的 makefile 和 configure ac 的子项目 子项目是用于为主项目生成源文件的程序 有一个选项可以禁用该项目的构建并尝试使用已安装的版本 无论哪种情况 我都会创建一个在 Makefi
  • .h 是从 .h.in 生成的吗?

    我的库在构建后创建的 h 文件中有结构定义 但我在相应的 h in 中找不到这些定义 有人可以告诉我这一切是如何工作的以及它从哪里获取额外信息吗 具体来说 我正在构建 pth 用户空间线程库 它有 pth p h in 它不包含我正在寻找的
  • 如何在 Makefile.am 中指定我想要 C++0x?

    目前我的项目有以下简单的树 Makefile am configure ac README src main cpp src Makefile am bin 我正在尝试遵循以下教程 http www gnu org software aut
  • JNI 和 Java:ant 调用 make 还是 make 调用 ant?

    我即将第一次进入 JNI Java 本机接口 的世界 以提供从平台特定的 C C 代码到 Java 的文件系统更改通知 除非有人推荐一些我错过的出色的图书馆来做这件事 作为 JNI 的新手 我已经设法找到了很多关于 JNI 接口方面和库生成
  • 使用 GCC 和 autotools 为各个源文件设置编译标志的最佳方法是什么?

    我需要使用自动工具禁用单个文件的优化标志 最好的方法是什么 您是指单个源文件还是单个可执行文件 禁用可执行文件的优化很简单 bin PROGRAMS myprog myprog SOURCES foo c bar c myprog CFLA
  • 通过相同的 Makefile 生成 Makefile 的包含文件

    在我的程序中 我有一个有点复杂的构建过程 目前 在我使用的一个目录中include in Makefile am对于一个文件 该文件不存在 但必须自行构建 原因是这个包含文件相当长 此外 在实际程序中 它不仅仅是一个文件 而是多个文件 并且
  • 在 Intel 机器上构建 Apple Silicon 二进制文件

    如何在 macOS 11 Intel 上编译 C 项目以在 Silicon 上运行 我当前的构建脚本很简单 configure make sudo make install 我尝试过使用 host and target标志与aarch64
  • 如何不在输出中打印 makefile 中的注释

    我有一个像这样的 makefile install somecommand some explanation for next command lastcommand 发生的事情是评论 some explanation for next c

随机推荐

  • Django 模板未加载

    我有一个名为 src 的项目和名为 app 的应用程序 并且我的应用程序中有一个模板文件夹 在我的模板文件夹中 我有另一个名为 Pages 的文件夹 我的 html 页面 base html 和 view html 驻留在其中 我的 vie
  • SwiftUI 文本视图不显示不可显示的字符

    我有 Swift 代码 可以解析 LLDP 链路层发现协议 帧 其中包括可以由供应商任意定义的字段 有时它是一个字符串 有时它是任意数据结构 以下是我如何获取数据并将其强制转换为具有 utf8 编码的字符串 let ouiString St
  • C# 读取USB描述符

    如何用C 读取USB描述符 我发现LibUSB NET但我无法像示例中那样获取 USB 设备 UsbRegDeviceList allDevices UsbDevice AllDevices 它返回计数 0 None
  • spring中使用@Bean和@Component的名称和别名

    我们如何定义 a 单一名字b 多个名称 别名 使用 Bean 和 Component 注释 在 XML 中我们这样定义 对于单个名称
  • 存储时间信息:需要时区吗?

    我很想知道我正在考虑的是否是不好的做法 或者因为这是一个特定且经过深思熟虑的选择 所以它实际上是一个不错的主意 我想存储特定城市发生的事件的日期信息 我想将该数据存储为 UTC 时间戳 简单地存储时间戳和城市 ID 国家 ID 与特定时区相
  • 在 TOleContainer 中嵌入多个 MS Word 实例

    这让我很头疼 我正在开发的 delphi 应用程序使用 TOLEContainer 中的 Word 打开一个或多个表单 我遇到的问题是 当使用嵌入的 Word 实例打开多个表单时 一个实例的控件会影响所有其他实例 而第一个实例上的控件不可用
  • CAKE 构建和 NUNIT3 生成空结果文件

    我正在使用 cake build 并尝试将 cake 单元测试结果上传到 AppVeyor 但是当我在本地运行时 Cake Nunit3 生成空结果 我认为这就是导致 AppVeyor 上错误的原因 在下面的块中 生成了 NUnitResu
  • 如何使用 Velocity.js 为翻译属性设置动画?

    我有一个简单的块 应该使用 translateX 向左移动 200px 它将向左移动 位置也向左 我似乎无法使用translateX 或translateY 移动块 Transform 翻译的 CSS 值将起作用 使用翻译的原因是与位置相比
  • 窗口最小化时的 AudioContext 计时问题

    我按照中的说明进行操作本文 http www html5rocks com en tutorials audio scheduling 并创建了一个 Javascript 节拍器 它利用 Web Audio API 并具有audioCont
  • Visual Studio 2010 右键单击​​时崩溃

    我在 Windows 7 中遇到了这个问题 现在使用 Windows 8 1 x64 的格式化后且非常干净的 C 磁盘 我也遇到了这个问题 当我在 Visual Studio 2010 中执行 Visual C 应用程序并右键单击以显示右侧
  • 如何在 OSX 上安装 python-gtk2、python-webkit 和 python-jswebkit

    我已经阅读了许多相关问题 但仍然不清楚如何做到这一点 因为有许多可用的软件组合 并且许多解决方案似乎已经过时 在 OSX 上的虚拟环境中安装以下内容的最佳方法是什么 python gtk2 python webkit python jswe
  • 没有父表标签的 td

    HTML td class tabletd text one td br td class tabletd this is next td td
  • ADK 1.0 设备无法与 Jelly Bean 配合使用,为什么?

    刚刚将久经考验的 ADK 配件连接到 Nexus 7 和 Galaxy Nexus 连接失败 并显示 无法读取设备协议版本 消息 以为主板坏了 用 ICS 连接到 Nexus S 工作得很好 在 Jelly Bean 升级之前也在 Gala
  • 消息:call_user_func_array() 期望参数 1 是有效的回调

    遇到 PHP 错误 严重性 警告 消息 call user func array 期望参数 1 是有效的回调 类 Error 没有方法 index 文件名 core CodeIgniter php 线路号码 532 回溯 文件 var ww
  • 在离子框架中放大时,离子滚动使我的图像变得模糊

    我在 ionic 框架的 ion scroll 标签中加载图片 当我尝试放大时 图片变得模糊 字母也无法辨认 这种情况在我的浏览器和 Android 上都会发生 我的模板的代码
  • 如何自定义android中长按/延迟按钮按下的时间间隔

    我正在制作一个应用程序 它有一个按钮来执行操作 但我想在用户长按按钮时执行该操作 因为 Google 提供了长按持续时间 appx 5 秒 但我想自定义这个持续时间 请帮忙 你可以试试Touch Listener去做这个 Try Handl
  • 用于组合 NUnit 或 MSTest XML 结果的 MSBuild 任务

    我有一组 NUnit XML 结果文件 由 xUnit NET 通过 Xunit Runner MSBuild xunit msbuild 任务的 NUnitXml 参数生成 几乎与如何让 Team Build 显示 xUnit net 测
  • 如何在 woocommerce 中为不同类别存档页面调用不同模板

    我在 woocommerce 中有两个类别 一个是 男性 另一个是 女性 默认 woocommerce 为类别存档页面调用 archive product php 但我想为每个类别存档页面显示不同的布局 这个怎么做 您可以看到 WooCom
  • JS 异步/等待任务队列

    在我的 JS 应用程序中 我使用 async await 功能 我想执行多个 API 调用 并希望它们被一个接一个地调用 换句话说 我想替换这个简单的方法 const addTask async url options gt return
  • 如何使用自动工具设置包含路径

    我正在开发一个 C 项目 该项目使用autoconf automake 我正在努力正确设置包含路径 CPPFLAGS 我读了大约3个小时的文档 但我还没有弄清楚 我不是在寻找黑客 而是在寻找正确的方法来做到这一点 这是我的难题 据我所知 包