自定义编译标志以启用特定功能
Custom compilation flag to enable specific feature
我有一个 Qt 项目需要一个库 (gphoto2) 来启用一些不是必需的功能。我想在我的 qmake
或 make
调用中添加某种配置选项以启用使用此库的功能,这样我就可以在不安装它的情况下进行编译。
配置这样的东西的最佳方法是什么?
我想我需要一些方法来添加一个基于编译器参数的定义,我可以在我的代码中使用 #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
,它更快、更灵活且更易于阅读。
我有一个 Qt 项目需要一个库 (gphoto2) 来启用一些不是必需的功能。我想在我的 qmake
或 make
调用中添加某种配置选项以启用使用此库的功能,这样我就可以在不安装它的情况下进行编译。
配置这样的东西的最佳方法是什么?
我想我需要一些方法来添加一个基于编译器参数的定义,我可以在我的代码中使用 #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
,它更快、更灵活且更易于阅读。