【问题标题】:When writing a module in C, how to correctly reference header files upon which the module is built?用 C 编写模块时,如何正确引用构建模块的头文件?
【发布时间】:2022-11-11 00:10:04
【问题描述】:

例如,当编写 NGINX 模块并需要包含来自所述模块的标头时,我该怎么做?

#include <ngx_core.h>
#include <ngx_http.h>

自然,找不到标头,因为它们不存在于磁盘上。我怀疑解决此问题的正确方法是引入整个 NGINX 源的标头,以便我可以引用模块中的标头。

我在这里寻找设计时编译器反馈,而不是寻找编译时支持,因为该模块是使用 NGINX 的 configure 脚本构建的,该脚本处理编译的连接。

更具体地说,如何在不将所有 NGINX 头文件引入我的 src 目录的情况下在 VS Code 中解决这个问题?我需要某种符号文件吗?

如果我需要一个带有标头的顶级 lib 目录,那很好,但我无法更改源文件中的包含路径(因此我无法将包含路径更改为例如../lib/nginx/ngx_core.h),因为这将在期间失败编译时间。

【问题讨论】:

  • 如果您希望 VSC 在这里为您提供支持,您需要提供标题。它们不需要在你的项目的源代码树中,而是使用你的操作系统的包管理器来安装这个库的开发支持。 -- 由于我不使用 VSC(它只是一个智能编辑器,但不是一个严肃的 IDE),我只能假设您应该能够使用已安装库的路径设置您的项目。
  • 了解标题需要是某处为了利用它们。不确定 NGINX 是否按照您的建议提供开发包。至少我找不到任何关于它的东西。对于一个建立在其他 C 代码基础上的传统 C 程序,人们将如何去做呢?
  • 由于在编译时也需要标头(以及在链接时需要库,在运行时也需要共享库),您应该阅读有关推荐方式的项目文档。然后你有标题,你可以设置 VSC 的项目。

标签: c nginx visual-studio-code nginx-module


【解决方案1】:

我能够通过克隆 NGINX 存储库(以及我需要的其他存储库)并为我的项目添加包含路径到我的 VS Code 配置,以便 C/C++ 扩展可以找到它们来解决这个问题。

.vscode/c_cpp_properties.json

{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**",
                "~/Projects/third-party/nginx/objs/**",
                "~/Projects/third-party/nginx/src/**"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/clang",
            "cStandard": "c17",
            "cppStandard": "c++14",
            "intelliSenseMode": "linux-clang-x64"
        }
    ],
    "version": 4
}

对于 NGINX,这需要您下载发行版/GZip,将其解压缩到您想要的位置,然后运行 ​​./configure - 这会在 objs 中生成一些必需的内容/标题。

【讨论】:

    猜你喜欢
    • 2011-08-03
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 2019-09-03
    相关资源
    最近更新 更多