【问题标题】:Custom compilation flag to enable specific feature自定义编译标志以启用特定功能
【发布时间】:2017-10-03 12:10:17
【问题描述】:

我有一个 Qt 项目,它需要一个库 (gphoto2) 来启用一些不必要的功能。我想在我的qmakemake 调用中添加某种配置选项以启用使用此库的功能,这样我就可以在不安装它的情况下进行编译。

配置这样的东西的最佳方法是什么? 我想我需要一些方法来添加基于编译器参数的定义,我可以使用#ifdef ...在我的代码中查询它

【问题讨论】:

    标签: c++ qt makefile qmake


    【解决方案1】:

    我假设你使用make(没有qmake)。在 Qt 项目中使用GNU make(单独)是合理且非常容易的。您可以使用其他一些 build automation 工具,例如 ninja

    然后您可以决定通过使用-DWITH_GPHOTO 编译您的代码并在您的C++ 代码中使用#if WITH_GPHOTO 来启用该Gphoto 功能。

    你可以通过添加来编译

    CXXFLAGS+= -DWITH_GPHOTO
    

    在你的Makefile

    我不会将其称为“自定义编译器标志”(例如,GCC plugins 可以提供)而是预处理器标志。这是相当标准的做法。

    也许您还想将此类标志传递给moc。然后您的 Makefile 正在运行 moc 通过一些规则和命令,您也可以对其进行调整。

    顺便说一句,您可以考虑GNU autoconf 或其他一些Makefile 生成器,例如cmake。我认为你不应该在这些上花太多时间......

    PS。我不知道这个想法是如何转化为qmake 的,让你去了解。

    【讨论】:

      【解决方案2】:

      假设您使用的是 qmake,您可以根据文件或环境变量的存在情况添加预处理器定义。 您可以添加一个 qmake 项目来编译您的外部库,并默认将其放置在您自己的项目中。

      LIBGPHOTO2_PATH = $$getenv(LIBGPHOTO2PATH)
      isEmpty(LIBGPHOTO2_PATH): LIBGPHOTO2_PATH = ../../libgphoto2
      
      exists($$LIBGPHOTO2_PATH/libgphoto2.pri): include($$LIBGPHOTO2_PATH/libgphoto2.pri)
      

      在 libgphoto2.pri 中添加预处理器定义以指示 libgphoto2 的存在,添加包含和链接器路径等:

      DEFINES += WITH_LIBGPHOTO2
      

      在依赖项目的代码中,使用#ifdef 检查是否存在。

      除了创建要编译的 qmake-project 之外,您还可以检查给定路径中是​​否存在已编译库并直接设置值(我不知道 libgphoto 是如何编译的,所以我假设默认目录结构为包括/,lib/等):

      LIBGPHOTO2_PATH=$$getenv(LIBGPHOTO2PATH)
      isEmpty(LIBGPHOTO2_PATH): LIBGPHOTO2_PATH = ../../libgphoto2
      
      exists($$LIBGPHOTO2_PATH/include) {
          DEFINES += WITH_LIBGPHOTO2
          INCLUDEPATH += $$LIBGPHOTO2_PATH/include
          LIBS += -L$$LIBGPHOTO2_PATH/lib -lgphoto2
      }
      

      但是,您应该考虑改用更现代的东西,例如 qbs,它更快、更灵活且更易于阅读。

      【讨论】:

        猜你喜欢
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-24
        • 1970-01-01
        相关资源
        最近更新 更多