Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt4 每个目标包括(${QT\u USE\u FILE})_Qt4_Cmake - Fatal编程技术网

Qt4 每个目标包括(${QT\u USE\u FILE})

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-

我有一个基于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()
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中的现实: