自定义编译标志以启用特定功能

Custom compilation flag to enable specific feature

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

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

查询它

我假设您使用 make(没有 qmake)。 GNU make (alone) on Qt projects. You could use some other build automation tool like ninja.

合理且易于使用

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

你可以通过添加

来编译
CXXFLAGS+= -DWITH_GPHOTO

在你的 Makefile

我不会称其为 "custom compiler flag"(例如 GCC plugins 可以提供),而是预处理器标志。这是非常标准的做法。

也许您也想将此类标志传递给 moc。然后你的 Makefile 是 运行 moc 通过一些规则和命令,你也可以定制。

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

PS。我不知道这个想法是如何转化为 qmake 的,让你自己去发现。

假设您正在使用 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 是如何编译的,所以我假设一个默认目录具有 include/、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,它更快、更灵活且更易于阅读。