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

时间:2017-10-03 12:10:17

标签: c++ qt makefile qmake

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

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

在我的代码中查询

2 个答案:

答案 0 :(得分: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并让你知道。

答案 1 :(得分:1)

假设您正在使用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 / etc):

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,这样更快,更灵活,更容易阅读。