如何可靠地包含可能位于不同(未知)目录中的外部头文件?

How do I robustly include external header files that may be in different (unknown) directories?

我正在尝试编写一个将在多个平台上编译 C 项目的 Makefile,例如:CentOS、OS X、OpenSUSE。我 运行 遇到了这个问题,但是,外部库的头文件并不总是在同一个地方。我认为这是由于包装,我无法控制。

例如: 在包含 BLAS 文件 lapacke.h 时,我的 CentOS 安装所需的包含语句是 #include<lapacke.h>。在 OpenSUSE 上,路径是 #include<openblas/lapacke.h>

我可以使用 #include<lapacke.h>,然后用 -I/usr/include/openblas 编译,这在 CentOS 和 OpenSUSE 上都有效,但我不希望这个包含路径在一般情况下有效,因为其他系统可能会将 openblas 放在不同的位置。我如何配置此项目以在大多数平台上编译而不需要用户手动修改 Makefile?

How do I configure this project to compile on most platforms without requiring users to tinker with the Makefile manually?

因为它适用于一般的图书馆,所以这是一个经典且长期存在的问题。它是构建配置系统(例如 Autotools 和 CMake)以及 pkg-config 实用程序的存在理由 的一部分。一些软件包提供了自己的实用程序来报告构建详细信息。

None 其中是万无一失的。如果你不能或不想依赖它们中的任何一个,那么你的其他选择基本上是

  • 让用户提供所需的路径(通过编辑文件或通过软件随附的手动脚本),或者
  • 为已知系统类型提供一堆预建配置,并自动检测或要求用户指定系统类型。

我已经看到了以上所有内容,单独看到过,也看到过各种组合。