2016-11-22 156 views
0

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

最后我想有像这样的结构的单一解决方案:为第一个项目

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

+2

是否可以选择让两个'CMakeLists.txt'文件保持不变,并且只添加一个可以执行两个'add_directory()'调用的父代? – Angew

+0

只需通过外部功能移动外部功能,然后按子文件夹移动子文件夹。我没有得到实际的问题。 – usr1234567

+0

@Angew能否请你提供一个代码示例 – test11

回答

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_BINARY_DIR分别为CMAKE_CURRENT_SOURCE_DIRCMAKE_CURRENT_BINARY_DIR。特别是,这会影响中的命令项目1.

原因set(CMAKE_MODULE_PATH ...)file(COPY ...)是,现在CMAKE_SOURCE_DIRCMAKE_BINARY_DIR将参考顶层(新建)项目的目录。

+0

项目1和项目2分别进行基因处理,没有错误。但是当我做了建议的答案我得到错误,我应该提供OpenVRConfig.cmake目录。 – test11

+0

@ test11我没有注意到你正在使用buildsystem-global路径;答案已更新。 – Angew