【问题标题】:Per target include(${QT_USE_FILE})每个目标包括(${QT_USE_FILE})
【发布时间】:2013-11-03 00:37:53
【问题描述】:

我有基于 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}")

对此有什么办法吗?

【问题讨论】:

    标签: qt4 cmake


    【解决方案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

    【讨论】:

      【解决方案2】:

      一种简单的解决方案是在子目录中创建目标。结果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模块的使用方面,可能有更简单的解决方案或解决方法(:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-05
        • 1970-01-01
        • 1970-01-01
        • 2017-03-22
        相关资源
        最近更新 更多