1

我有基于 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)”评估为真时,它会将“-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}")

对此有什么可做的吗?

4

2 回答 2

1

使用 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

于 2013-11-04T12:56:44.887 回答
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模块的使用方面,可能有更简单的解决方案或解决方法(:

于 2013-11-03T07:25:52.733 回答