C++ CMake:在CMake脚本执行期间生成源

C++ CMake:在CMake脚本执行期间生成源,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)
    add_subdirectory(src)
    
    ###################################################################
    # in root/my_proj/src/CMakeLists.txt:    
    
    ADD_CUSTOM_COMMAND(
       OUTPUT ../include/SomeSource.h SomeSource.cpp
       COMMAND generator ../definitions/SomeDefs1.txt
       DEPENDS generator ../definitions/SomeDefs1.txt
       )
    
    set(SRC_LIST SomeSource.cpp .... )
    set(HDR_LIST SomeSource.h .... )
    
    add_library(myProj STATIC ${SRC_LIST} ${HDR_LIST} )
    
    ###################################################################
    ###################################################################
    
    CMake的输出:

    .....
    -- Detecting C compiler ABI info - done
    -- Check for working CXX compiler using: Visual Studio 12 2013
    -- Check for working CXX compiler using: Visual Studio 12 2013 -- works
    -- Detecting CXX compiler ABI info
    -- Detecting CXX compiler ABI info - done
    -- Configuring done
    CMake Error at src/CMakeLists.txt:145 (add_library):
      Cannot find source file:
    
        ../include/SomeSource.h
    
      Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp
      .hxx .in .txx
    
    从CMake开始,从那里开始:

    add_executable( generator ${generator_SOURCES} )
    add_custom_command( OUTPUT source1.cpp source2.cpp
        COMMAND generator args1 args2
        COMMENT "Generating sources..." )
    
    是否将myProj集成到其他项目中,或将其保持在外部取决于您的个人需要,并影响最终设置的外观


    回复您的编辑:

    首先,将头文件包含在源列表中是一个非常糟糕的主意。CMake与编译器合作,应该能够找出源文件对它们包含的头文件的依赖关系,而且它们比大多数人做得更好。C++的
    #include
    已经告诉编译器处理标题

    其次,您正在显示的CMake代码不是您正在执行的代码。您的
    add_library()
    列出了
    SomeSource.h
    ,但CMake抱怨
    。/include/SomeSource.h
    。目录名也不起作用。这使得很难说到底是什么错了

    在熟悉新工具时,我的一般建议是:不要立即尝试让它在您最终希望它工作的环境中运行(在本例中是myProj)。相反,设置一个简单的测试环境(使用目录X和Y、源文件foo.cpp和bar.cpp,您就知道了),并测试这些概念(比如,让
    echo
    创建一个文件而不是
    generator
    ,这样您就不需要先构建
    generator
    ,这是下一步)

    这样,如果出现任何问题,您可以在摘要中寻求帮助,并且您可以提供完整的示例代码供其他人解决,而无需在项目设置中摇摆不定

    此外,你还可以避免错误的先入之见带来的问题。很多时候,你的第一次尝试会导致一个尴尬的设置,真正的优雅只有从经验教训中产生。投入时间正确学习该工具


    如果您还不知道,允许CMake创建一个MSVC项目文件,将给定的源文件分组在一起,这样您就可以在CMake控制下创建项目,但仍然可以在MSVC中轻松工作



    我已经建立了一个“框架”CMake设置,我在各种项目中使用它,也许你对此感兴趣(出于灵感或实际使用):

    @VramVardanian:更新了答案。我总是将我的头文件(并非所有包含的头文件)列为CMake源,以便它们显示在生成的项目中。@John:你将它们列在相应的
    source\u组()
    命令,但不在
    添加库()
    中。这只是自找麻烦。
    首先,在源代码列表中包含头文件是一个非常糟糕的主意。
    -1,使用
    源代码组
    或notcommand
    添加可执行文件(foo-foo.cpp-foo.hpp)都是完全正常的
    不会产生
    gcc-o foo foo.cpp foo.hpp
    如果你不相信我,你可以自己检查。