每个目标包括($ {QT_USE_FILE})

时间:2013-11-03 00:37:54

标签: 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-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}")

可以做些什么吗?

2 个答案:

答案 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中实现的:

http://www.youtube.com/watch?v=GJ0kMsLbk6Q