Qt4 每个目标包括(${QT\u USE\u FILE})
我有一个基于CLI的应用程序,我决定向其中添加可选的QT4 GUI。我的CMakeLists.txt如下所示:Qt4 每个目标包括(${QT\u USE\u FILE}),qt4,cmake,Qt4,Cmake,我有一个基于CLI的应用程序,我决定向其中添加可选的QT4 GUI。我的CMakeLists.txt如下所示: ... add_library(applib ... add_executable(app-cli ... target_link_libraries(app-cli applib) if(QT4_FOUND) ... include(${QT_USE_FILE}) add_executable(app-qt ... target_link_libraries(app-
...
add_library(applib ...
add_executable(app-cli ...
target_link_libraries(app-cli applib)
if(QT4_FOUND)
...
include(${QT_USE_FILE})
add_executable(app-qt ...
target_link_libraries(app-qt ${QT_LIBRARIES} applib)
endif()
find_package(Qt4 REQUIRED)
add_executable(app-qt ...)
target_link_libraries(app-qt Qt4::QtGui)
# And Qt4::QtNetwork etc if you need that.
它可以工作,但我注意到,每当“if(QT4_-FOUND)”的计算结果为true时,它都会向编译器调用添加“-DQT_-CORE_-LIB-DQT_-GUI_-LIB-DQT_-NO-DEBUG”,以调用所有源文件,包括不支持qt的代码。虽然是良性的,但我认为这是不必要的。据我所知,问题的原因是include(${QT_USE_FILE}),其中包括我的机器上的/usr/share/cmake/Modules/UseQt4.cmake,其中第一个非注释行是:
add_definitions(${QT_DEFINITIONS})
而我想要的可能是
set_target_properties (app-qt PROPERTIES COMPILE_DEFINITIONS "${QT_DEFINITIONS}")
对此可以做些什么吗?一个简单的解决方案是在子目录中创建目标。因此,
add_定义
将在子目录中调用,并且不会影响当前目录
如果不能接受,你可以用另一种方法解决。命令add_定义
modifydirectory属性。因此,您可以简单地删除定义
从列表中。试试这个例子:
# setted somewhere
add_definitions(-DMYDEFS) # you don't need this
add_definitions(-DMYBoo)
# get definitions
get_directory_property(new_definitions COMPILE_DEFINITIONS)
# remove unnecessary definitions
list(REMOVE_ITEM new_definitions MYDEFS)
# set new definitions
set_directory_properties(PROPERTIES COMPILE_DEFINITIONS "${new_definitions}")
请注意,如果定义的格式为MYDEF=SOMEVALUE
,则此操作将不起作用。您需要重写列表(删除项目…
PS我不知道Qt模块的使用情况,可能有更简单的解决方案或解决方法(:使用CMake 2.8.11或更高版本,不要使用Use文件(这是问题所在),而是使用Qt导入的目标,如下所示:
...
add_library(applib ...
add_executable(app-cli ...
target_link_libraries(app-cli applib)
if(QT4_FOUND)
...
include(${QT_USE_FILE})
add_executable(app-qt ...
target_link_libraries(app-qt ${QT_LIBRARIES} applib)
endif()
find_package(Qt4 REQUIRED)
add_executable(app-qt ...)
target_link_libraries(app-qt Qt4::QtGui)
# And Qt4::QtNetwork etc if you need that.
这将过渡地使用QtGui所需的include目录和编译定义(例如-Iinclude/QtGui和-DQT_GUI_LIB),并且它是目标范围的,因此不会影响其他目标
我在这次演讲中所描述的一切都是CMake 2.8.11中的现实: