C++ cmake:尝试在cmake脚本执行期间调用msbuild

C++ cmake:尝试在cmake脚本执行期间调用msbuild,c++,cmake,C++,Cmake,我正在尝试将我的Visual Studio解决方案迁移到CMake 我有两个项目——生成器(Guangal.exe生成C++文件源)和MyPROJ(包括一些必须由Guang.exe处理的文本文件)。 我想要的是: 建造发电机项目 从STEP1使用Guang.Exe从ProjyMyProj/中的文本文件生成C++源文件 将这些生成的源文件放入myProj的最终VS项目中 到目前为止我所做的: #####################################################

我正在尝试将我的Visual Studio解决方案迁移到CMake

我有两个项目——生成器(Guangal.exe生成C++文件源)和MyPROJ(包括一些必须由Guang.exe处理的文本文件)。 我想要的是:

  • 建造发电机项目
  • 从STEP1使用Guang.Exe从ProjyMyProj/
  • 中的文本文件生成C++源文件
  • 将这些生成的源文件放入myProj的最终VS项目中
  • 到目前为止我所做的:

    ###################################################################
    # in root/generator/CMakeLists.txt:
    set(SRC_LIST .... )
    set(HDR_LIST .... )
    add_executable(generator ${SRC_LIST} ${HDR_LIST})    
    
    ###################################################################
    # in root/my_proj/CMakeLists.txt:
    
    add_subdirectory(../generator/  ../generator/cmake_out)
    
    # TRY TO BUILD GENERATOR.EXE. DON'T WORK, BECAUSE ../generator/cmake_out/ IS EMPTY YET
    execute_process(COMMAND msbuild ../generator/cmake_out/generator.vcxproj)
    # <copy generated files to ./src>
    
    add_subdirectory(src)
    
    ###################################################################
    # in root/my_proj/src/CMakeLists.txt:    
    
    set(SRC_LIST SomeSource.cpp .... )
    set(HDR_LIST SomeSource.h .... )
    
    add_library(myProj STATIC ${SRC_LIST} ${HDR_LIST} )
    
    ###################################################################
    #在root/generator/CMakeLists.txt中:
    设置(SRC_列表…)
    设置(HDR_列表…)
    添加可执行文件(生成器${SRC_LIST}${HDR_LIST})
    ###################################################################
    #在root/my_proj/CMakeLists.txt中:
    添加子目录(../generator/../generator/cmake_out)
    #尝试生成GENERATOR.EXE。不工作,因为../generator/cmake_out/还为空
    执行进程(命令msbuild../generator/cmake_out/generator.vcxproj)
    # 
    添加子目录(src)
    ###################################################################
    #在root/my_proj/src/CMakeLists.txt中:
    设置(SRC_LIST SomeSource.cpp…)
    设置(HDR\u LIST SomeSource.h…)
    添加库(myProj STATIC${SRC_LIST}${HDR_LIST})
    
    那么,这里出了什么问题?为什么execute_process()失败?似乎CMake的执行顺序非常混乱。

    用于在编译期间执行generator.exe。确保指定生成的所有输出文件。将这些输出文件列为myProj的源文件。CMake应该为您构建一个包含两个项目的解决方案,这两个项目将首先构建generator,执行它以生成自动myProj文件,然后构建myProj

    add_custom_command(
        OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/output1.cpp ${CMAKE_CURRENT_BINARY_DIR}/output1.h
        COMMAND generator
        DEPENDS generator
        )
    
    add_library(myProj ${CMAKE_CURRONT_BINARY_DIR}/output.h ${CMAKE_CURRENT_BINARY_DIR}/output.cpp)
    

    看起来
    execute\u进程
    失败是您遇到的最小问题,但要回答您的问题:首先,您可以使用

    execute_process(COMMAND msbuild ../generator/cmake_out/generator.vcxproj
                    RESULT_VARIABLE result)
    message(STATUS "Result: ${result}")
    
    您可能会看到“系统找不到指定的文件”,因为cmakeshell不知道msbuild命令所在的目录。您可以只提供msbuild的完整路径,例如在我的系统(VS 2013)上,我将使用:

    execute_process(COMMAND "C:\\Program Files\\MSBuild\\14.0\\Bin\\MSBuild.exe"  
                    ../generator/cmake_out/generator.vcxproj)
    

    据我所知,您的建议可能会导致在项目构建阶段(在CMake执行之后)生成源文件。这样我就不会在VS项目中看到生成的文件,对吗?这些文件在第一次构建之后才会存在,但名称将列在项目文件中(如果我没记错的话)。在生成的VS项目中包含这些生成的源文件非常重要。问题是-为什么execute_process()失败?