【问题标题】:Combining two solutions in one using cmake使用 cmake 将两种解决方案合二为一
【发布时间】:2016-11-22 16:02:49
【问题描述】:

我有两个单独的 Visual Studio 2013 解决方案,我想将它们迁移到一个解决方案中,因为第一个解决方案(使用 Qt)用作第二个解决方案的 GUI。

最后,我希望有一个结构如下的单一解决方案:

--Solution
-------All Build
-------Project 1
----------------External Dependencies
----------------header files
----------------Source files 
-------Project 2
----------------External Dependencies
----------------header files
----------------Source files 

第一个项目的CMakeLists.txt 是:

cmake_minimum_required(VERSION 2.8.5 FATAL_ERROR)
if(POLICY CMP0025)
  cmake_policy(SET CMP0025 NEW) # CMake 3.0
endif()
if(POLICY CMP0053)
  cmake_policy(SET CMP0053 NEW) # CMake 3.1
endif()

project (Project1)

set(CMAKE_MODULE_PATH 
    ${CMAKE_SOURCE_DIR}/CMake
)

find_package(VTK REQUIRED)
include(${VTK_USE_FILE})

find_package(OpenVR REQUIRED)
find_package(SDL2 REQUIRED)

include_directories(${OPENVR_INCLUDE_DIRS})
include_directories(${SDL2_INCLUDE_DIR})
include_directories(${CMAKE_SOURCE_DIR})

set(HEADER_FILES
    ...
)

set(CODE_FILES
    ...
)


# Copy the obj file to the build directory
file(COPY Data/***.*** DESTINATION ${PROJECT_BINARY_DIR}/Data)
file(COPY Data/***.*** DESTINATION ${PROJECT_BINARY_DIR}/Data)
file(COPY Data/***.*** DESTINATION ${PROJECT_BINARY_DIR}/Data)

#QT5_ADD_RESOURCES(visualization_RCS resources.qrc)

if(VTK_LIBRARIES)
add_executable(${PROJECT_NAME} ${CODE_FILES} ${HEADER_FILES})
  target_link_libraries(${PROJECT_NAME} ${VTK_LIBRARIES} ${SDL2_LIBRARY})  
else()
  message("Specific Libs")
endif()

第二个项目的CMakeLists.txt 是:

cmake_minimum_required(VERSION 2.8.12)
project(Project2)
find_package(Qt5Widgets)
set(MyProjectLib_src ${PROJECT_SOURCE_DIR}/gui.cpp)
set(MyProjectLib_hdr ${PROJECT_SOURCE_DIR}/gui.h)
set(MyProjectLib_ui  ${PROJECT_SOURCE_DIR}/gui.ui)
set(MyProjectBin_src ${PROJECT_SOURCE_DIR}/main.cpp)
qt5_wrap_cpp(MyProjectLib_hdr_moc ${MyProjectLib_hdr})
qt5_wrap_ui (MyProjectLib_ui_moc  ${MyProjectLib_ui})
include_directories(${PROJECT_SOURCE_DIR})
include_directories(${PROJECT_BINARY_DIR})
add_library(MyProjectLib STATIC 
    ${MyProjectLib_src}
    ${MyProjectLib_hdr_moc}
    ${MyProjectLib_ui_moc}
)
target_link_libraries(MyProjectLib Qt5::Widgets)
add_executable(MyProject ${MyProjectBin_src})
target_link_libraries(MyProject MyProjectLib)

问题是我无法将两个CMakeLists.txt 合并到一个文件中。自从几天以来,我一直在使用此代码

cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR)
if(POLICY CMP0025)
  cmake_policy(SET CMP0025 NEW) # CMake 3.0
endif()
if(POLICY CMP0053)
  cmake_policy(SET CMP0053 NEW) # CMake 3.1
endif()

project (project1)

set(CMAKE_MODULE_PATH 
    ${CMAKE_SOURCE_DIR}/CMake
)

find_package(VTK REQUIRED)
include(${VTK_USE_FILE})

find_package (Qt5Widgets REQUIRED)
find_package(OpenVR REQUIRED)
find_package(SDL2 REQUIRED)

include_directories(${OPENVR_INCLUDE_DIRS})
include_directories(${SDL2_INCLUDE_DIR})
include_directories(${CMAKE_SOURCE_DIR})

set(HEADER_FILES
    GPU/header.h
    ...
    ...
)

set(CODE_FILES
    GPU/sourcefile.cxx
    ...
)


#QT5_ADD_RESOURCES(visualization_RCS resources.qrc)
project (project2)


find_package (Qt5Widgets)


set (GuiLib_src Gui/gui.cpp)
set (GuiLib_hdr Gui/gui.h)
set (GuiLib_ui  Gui/gui.ui)
set (GuiBin_src Gui/main.cpp)


qt5_wrap_cpp(GuiLib_hdr_moc ${GuiLib_hdr})
qt5_wrap_ui (GuiLib_ui_moc  ${GuiLib_ui})


include_directories (${PROJECT_SOURCE_DIR})
include_directories (${PROJECT_BINARY_DIR})


add_library (GuiLib STATIC 
    ${GuiLib_src}
    ${GuiLib_hdr_moc}
    ${GuiLib_ui_moc}
)
target_link_libraries (GuiLib Qt5::Widgets)



if(VTK_LIBRARIES)
  add_executable(${PROJECT_NAME} ${CODE_FILES} ${HEADER_FILES})
  target_link_libraries(${PROJECT_NAME} ${VTK_LIBRARIES} ${SDL2_LIBRARY})  #Qt5::Core Qt5::Gui
  add_executable(Gui ${GuiBin_src})
  target_link_libraries (Gui GuiLib)
else()
  message("Specific Libs")
endif()

值得一提的是project1正在使用VTK、OpenVR和SDL,而project2只是使用Qt 5。

【问题讨论】:

  • 您是否可以选择保留两个 CMakeLists.txt 文件不变,只添加一个将执行两个 add_directory() 调用的父级?
  • 只需逐个外部要素移动外部要素,然后逐个子文件夹移动子文件夹。我没有得到真正的问题。
  • @Angew 能否提供一个代码示例
  • 您能发布您的迁移前CMakeLists.txt 文件的样子吗?我假设每个“解决方案”都有一个(因为您谈论将它们组合起来),所以请发布它们。与它们一起制定会更容易。
  • 您的 cmake 文件中有很多冗余(两次调用 project 命令,find_package(Qt5Widgets) 调用两次,VTK_LIBRARIES 在 if 语句中测试,同时您将 VTK 标记为必需,... )。除此之外,您的组合 CMakeLists 有什么问题?你有什么错误吗?您在这里寻求什么样的帮助?

标签: c++ qt cmake vtk


【解决方案1】:

满足您在问题中概述的要求的最简单解决方案是在Solution/CMakeLists.txt 中引入一个新的 CMakeList 文件:

cmake_minimum_required(VERSION 2.8.12)
project(NameForTheCombinedProject)

add_subdirectory(path/to/project1/dir)
add_subdirectory(path/to/project2/dir)

此外,您必须将项目中对CMAKE_SOURCE_DIRCMAKE_BINARY_DIR 的所有引用分别更改为CMAKE_CURRENT_SOURCE_DIRCMAKE_CURRENT_BINARY_DIR。特别是,这会影响项目 1 中的命令 set(CMAKE_MODULE_PATH ...)file(COPY ...)

原因是现在CMAKE_SOURCE_DIRCMAKE_BINARY_DIR会引用顶层(新建)项目的目录。

【讨论】:

  • project1 和 project2 分别生成且没有错误。但是当我做建议的答案时,我应该在哪里提供 OpenVRConfig.cmake 目录时出现错误。
  • @test11 我没有注意到您使用的是构建系统全局路径;答案已更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多