【发布时间】:2017-10-03 12:10:17
【问题描述】:
我有一个 Qt 项目,它需要一个库 (gphoto2) 来启用一些不必要的功能。我想在我的qmake 或make 调用中添加某种配置选项以启用使用此库的功能,这样我就可以在不安装它的情况下进行编译。
配置这样的东西的最佳方法是什么?
我想我需要一些方法来添加基于编译器参数的定义,我可以使用#ifdef ...在我的代码中查询它
【问题讨论】:
我有一个 Qt 项目,它需要一个库 (gphoto2) 来启用一些不必要的功能。我想在我的qmake 或make 调用中添加某种配置选项以启用使用此库的功能,这样我就可以在不安装它的情况下进行编译。
配置这样的东西的最佳方法是什么?
我想我需要一些方法来添加基于编译器参数的定义,我可以使用#ifdef ...在我的代码中查询它
【问题讨论】:
我假设你使用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 的,让你去了解。
【讨论】:
假设您使用的是 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,它更快、更灵活且更易于阅读。
【讨论】: