我有基于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-qt ${QT_LIBRARIES} applib)
endif()
它有效,但我注意到,只要“if(QT4_FOUND)”的计算结果为true,它就会将“-DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG”添加到所有源文件的编译器调用中,包括非qt意识代码。虽然良性,但我认为没有必要。据我所知,问题包括($ {QT_USE_FILE})责备,其中包括我机器上的/usr/share/cmake/Modules/UseQt4.cmake,其中第一个非评论行是:
add_definitions(${QT_DEFINITIONS})
虽然我想要像
这样的东西set_target_properties (app-qt PROPERTIES COMPILE_DEFINITIONS "${QT_DEFINITIONS}")
可以做些什么吗?
答案 0 :(得分:0)
简单的一种解决方案是在子目录中创建目标。结果add_definitions
将在子目录中调用,不会影响当前目录。
如果不可接受,你可以用另一种方式解决。命令add_definitions
修改目录属性。所以你可以简单地删除定义
从列表中。试试这个例子:
# 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
,则无效。您需要重写list(REMOVE_ITEM ...)
PS 我不知道Qt模块的使用方面,可能有更简单的解决方案或解决方法(:
答案 1 :(得分:0)
使用CMake 2.8.11或更高版本,不要使用USE文件(你是对的,这就是问题)并使用Qt导入的目标,如下所示:
find_package(Qt4 REQUIRED)
add_executable(app-qt ...)
target_link_libraries(app-qt Qt4::QtGui)
# And Qt4::QtNetwork etc if you need that.
这将传递性地使用包含目录和编译定义QtGui说它需要(例如-Iinclude / QtGui和-DQT_GUI_LIB),并且它是目标作用域,因此不会影响其他目标。
我在这次演讲中描述的一切都是在CMake 2.8.11中实现的: