Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.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
C++ 如何在生成前在cmake中执行命令?_C++_C_Makefile_Cmake - Fatal编程技术网

C++ 如何在生成前在cmake中执行命令?

C++ 如何在生成前在cmake中执行命令?,c++,c,makefile,cmake,C++,C,Makefile,Cmake,我希望CMake在开始其生成过程之前运行一个命令 因此,我在*CMakeLists.txt`的开头添加了execute\u process,但预期的提示只是零星出现的 cmake_minimum_required(VERSION 3.5) project(amba_ctrl_datalinkmsg) execute_process(COMMAND @echo 'HUHU HUHU HUHU') execute_process(COMMAND pwd) execute_process(COMM

我希望CMake在开始其生成过程之前运行一个命令

因此,我在*CMakeLists.txt`的开头添加了
execute\u process
,但预期的提示只是零星出现的

cmake_minimum_required(VERSION 3.5)

project(amba_ctrl_datalinkmsg)

execute_process(COMMAND @echo 'HUHU HUHU HUHU')
execute_process(COMMAND pwd)
execute_process(COMMAND make -C ${CMAKE_CURRENT_SOURCE_DIR}/msg -f Makefile)

include_directories(include)
add_library(
    ${PROJECT_NAME} STATIC
    "src/source.cpp"
)
有什么想法吗


我为何要这样做:

我需要从一些简单的定义文件生成一个Cpp类

  • 检查生成器的源或定义文件是否比生成的类文件更新
  • 如果需要,构建生成器
  • 生成源文件
  • 构建静态库
  • 我用一个简单的Makefile解决了第1点到第3点。4.使用CMakeList.txt完成,因为此库是更大项目中的子项目


    从上面输出到CMakeList.txt,不带my
    echo

    Process package 'amba_ctrl_datalinkmsg' with context:
    --------------------------------------------------------------------------------
     source_space => /home/.../src/amba_ctrl/amba_ctrl_datalinkmsg
      build_space => /home/.../build/amba_ctrl_datalinkmsg
    install_space => /home/.../install
       make_flags => -j8, -l8
      build_tests => False
    --------------------------------------------------------------------------------
    +++ Building 'amba_ctrl_datalinkmsg'
    ==> '. /home/.../build/amba_ctrl_datalinkmsg/cmake__build.sh && /usr/bin/make cmake_check_build_system' in '/home/.../build/amba_ctrl_datalinkmsg'
    ==> '. /home/.../build/amba_ctrl_datalinkmsg/cmake__build.sh && /usr/bin/make -j8 -l8' in '/home/.../build/amba_ctrl_datalinkmsg'
    make[2]: *** No rule to make target '/home/.../src/source.cpp', needed by 'CMakeFiles/amba_ctrl_datalinkmsg.dir/src/source.cpp.o'. Stop.
    CMakeFiles/Makefile2:99: recipe for target 'CMakeFiles/amba_ctrl_datalinkmsg.dir/all' failed
    make[1]: *** [CMakeFiles/amba_ctrl_datalinkmsg.dir/all] Error 2
    Makefile:127: recipe for target 'all' failed
    make: *** [all] Error 2
    
    如果makefile调用正确,cmake可以找到
    源.cpp
    。但如果没有调用,则不存在源和头

    在打电话给msgGen之前,先看一下树

    .
    ├── CMakeLists.txt
    ├── msg
    │   ├── def1.msg
    │   ├── def2.msg
    │   ├── def3.msg
    │   ├── Makefile
    │   └── msgGen.cpp
    ├── package.xml
    └── README.md
    
    .
    ├── CMakeLists.txt
    ├── include
    │   └── source.h
    ├── msg
    │   ├── def1.msg
    │   ├── def2.msg
    │   ├── def3.msg
    │   ├── Makefile
    │   ├── msgGen
    │   └── msgGen.cpp
    ├── package.xml
    ├── README.md
    └── src
        └── source.cpp
    
    呼叫msgGen后的树

    .
    ├── CMakeLists.txt
    ├── msg
    │   ├── def1.msg
    │   ├── def2.msg
    │   ├── def3.msg
    │   ├── Makefile
    │   └── msgGen.cpp
    ├── package.xml
    └── README.md
    
    .
    ├── CMakeLists.txt
    ├── include
    │   └── source.h
    ├── msg
    │   ├── def1.msg
    │   ├── def2.msg
    │   ├── def3.msg
    │   ├── Makefile
    │   ├── msgGen
    │   └── msgGen.cpp
    ├── package.xml
    ├── README.md
    └── src
        └── source.cpp
    

    添加
    RESULT\u变量

    alex:overlay_ws$ ament build --only-packages amba_ctrl_datalinkmsg
    # Topological order
     - amba_ctrl_datalinkmsg
    
    Process package 'amba_ctrl_datalinkmsg' with context:
    --------------------------------------------------------------------------------
     source_space => /home/.../src/amba_ctrl/amba_ctrl_datalinkmsg
      build_space => /home/.../build/amba_ctrl_datalinkmsg
    install_space => /home/.../install
       make_flags => -j8, -l8
      build_tests => False
    --------------------------------------------------------------------------------
    +++ Building 'amba_ctrl_datalinkmsg'
    ==> '. /home/.../build/amba_ctrl_datalinkmsg/cmake__build.sh && /usr/bin/make cmake_check_build_system' in '/home/.../build/amba_ctrl_datalinkmsg'
    make[1]: Entering directory '/home/.../src/amba_ctrl/amba_ctrl_datalinkmsg/msg'
    make gen
    make[2]: Entering directory '/home/.../src/amba_ctrl/amba_ctrl_datalinkmsg/msg'
    msgGen: build msgGen
    g++ msgGen.cpp -o msgGen --std=c++11 -D'GENTARGETCPP="../src/source.cpp"' -D'GENTARGETH="../include/source.h"'
    msgGen: run msgGen
    dlCpm.msg dlIomReceiver.msg dlIomSender.msg
    mkdir -p ../src/
    mkdir -p ../include/
    ./msgGen
    make[2]: Leaving directory '/home/.../src/amba_ctrl/amba_ctrl_datalinkmsg/msg'
    msgGen: ready
    make[1]: Leaving directory '/home/.../src/amba_ctrl/amba_ctrl_datalinkmsg/msg'
    -- Found ament_cmake: 0.0.0 (/home/alex/git/AMBA/Software/ros2_ws/install/share/ament_cmake/cmake)
    -- Using PYTHON_EXECUTABLE: /usr/bin/python3
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /home/.../build/amba_ctrl_datalinkmsg
    ==> '. /home/.../build/amba_ctrl_datalinkmsg/cmake__build.sh && /usr/bin/make -j8 -l8' in '/home/.../build/amba_ctrl_datalinkmsg'
    [ 50%] Building CXX object CMakeFiles/amba_ctrl_datalinkmsg.dir/src/source.cpp.o
    [100%] Linking CXX static library libamba_ctrl_datalinkmsg.a
    [100%] Built target amba_ctrl_datalinkmsg
    +++ Installing 'amba_ctrl_datalinkmsg'
    ==> '. /home/.../build/amba_ctrl_datalinkmsg/cmake__install.sh && /usr/bin/make install' in '/home/.../build/amba_ctrl_datalinkmsg'
    [100%] Built target amba_ctrl_datalinkmsg
    Install the project...
    -- Install configuration: ""
    -- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/environment/library_path.sh
    -- Up-to-date: /home/.../install/share/ament_index/resource_index/package_run_dependencies/amba_ctrl_datalinkmsg
    -- Up-to-date: /home/.../install/share/ament_index/resource_index/parent_prefix_path/amba_ctrl_datalinkmsg
    -- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/local_setup.bash
    -- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/local_setup.sh
    -- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/local_setup.zsh
    -- Up-to-date: /home/.../install/share/ament_index/resource_index/packages/amba_ctrl_datalinkmsg
    -- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake/amba_ctrl_datalinkmsg.cmake
    -- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake/ament_cmake_export_dependencies-extras.cmake
    -- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake/ament_cmake_export_include_directories-extras.cmake
    -- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake/ament_cmake_export_libraries-extras.cmake
    -- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake/amba_ctrl_datalinkmsgConfig.cmake
    -- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake/amba_ctrl_datalinkmsgConfig-version.cmake
    -- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/package.xml
    -- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake
    -- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake/register_amba_ctrl_datalinkmsg_implementation.cmake
    -- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake/get_amba_ctrl_datalinkmsg_typesupport.cmake
    -- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake/configure_amba_ctrl_datalinkmsg_library.cmake
    -- Up-to-date: /home/.../install/include/amba_ctrl_datalinkmsg
    -- Installing: /home/.../install/include/amba_ctrl_datalinkmsg/source.h
    -- Installing: /home/.../install/lib/libamba_ctrl_datalinkmsg.a
    -- [ament] Deploying: /home/.../install/local_setup.bash
    -- [ament] Deploying: /home/.../install/local_setup.sh
    -- [ament] Deploying: /home/.../install/local_setup.zsh
    -- [ament] Deploying: /home/.../install/setup.bash
    -- [ament] Deploying: /home/.../install/setup.sh
    -- [ament] Deploying: /home/.../install/setup.zsh
    -- [ament] Deploying: /home/.../install/_order_packages.py
    
    alex:overlay_ws$ ament build --only-packages amba_ctrl_datalinkmsg
    # Topological order
     - amba_ctrl_datalinkmsg
    
    Process package 'amba_ctrl_datalinkmsg' with context:
    --------------------------------------------------------------------------------
     source_space => /home/.../src/amba_ctrl/amba_ctrl_datalinkmsg
      build_space => /home/.../build/amba_ctrl_datalinkmsg
    install_space => /home/.../install
       make_flags => -j8, -l8
      build_tests => False
    --------------------------------------------------------------------------------
    +++ Building 'amba_ctrl_datalinkmsg'
    ==> '. /home/.../build/amba_ctrl_datalinkmsg/cmake__build.sh && /usr/bin/make cmake_check_build_system' in '/home/.../build/amba_ctrl_datalinkmsg'
    make[1]: Entering directory '/home/.../src/amba_ctrl/amba_ctrl_datalinkmsg/msg'
    make gen
    make[2]: Entering directory '/home/.../src/amba_ctrl/amba_ctrl_datalinkmsg/msg'
    msgGen: build msgGen
    g++ msgGen.cpp -o msgGen --std=c++11 -D'GENTARGETCPP="../src/source.cpp"' -D'GENTARGETH="../include/source.h"'
    msgGen: run msgGen
    dlCpm.msg dlIomReceiver.msg dlIomSender.msg
    mkdir -p ../src/
    mkdir -p ../include/
    ./msgGen
    make[2]: Leaving directory '/home/.../src/amba_ctrl/amba_ctrl_datalinkmsg/msg'
    msgGen: ready
    make[1]: Leaving directory '/home/.../src/amba_ctrl/amba_ctrl_datalinkmsg/msg'
    -- Found ament_cmake: 0.0.0 (/home/alex/git/AMBA/Software/ros2_ws/install/share/ament_cmake/cmake)
    -- Using PYTHON_EXECUTABLE: /usr/bin/python3
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /home/.../build/amba_ctrl_datalinkmsg
    ==> '. /home/.../build/amba_ctrl_datalinkmsg/cmake__build.sh && /usr/bin/make -j8 -l8' in '/home/.../build/amba_ctrl_datalinkmsg'
    [ 50%] Building CXX object CMakeFiles/amba_ctrl_datalinkmsg.dir/src/source.cpp.o
    [100%] Linking CXX static library libamba_ctrl_datalinkmsg.a
    [100%] Built target amba_ctrl_datalinkmsg
    +++ Installing 'amba_ctrl_datalinkmsg'
    ==> '. /home/.../build/amba_ctrl_datalinkmsg/cmake__install.sh && /usr/bin/make install' in '/home/.../build/amba_ctrl_datalinkmsg'
    [100%] Built target amba_ctrl_datalinkmsg
    Install the project...
    -- Install configuration: ""
    -- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/environment/library_path.sh
    -- Up-to-date: /home/.../install/share/ament_index/resource_index/package_run_dependencies/amba_ctrl_datalinkmsg
    -- Up-to-date: /home/.../install/share/ament_index/resource_index/parent_prefix_path/amba_ctrl_datalinkmsg
    -- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/local_setup.bash
    -- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/local_setup.sh
    -- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/local_setup.zsh
    -- Up-to-date: /home/.../install/share/ament_index/resource_index/packages/amba_ctrl_datalinkmsg
    -- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake/amba_ctrl_datalinkmsg.cmake
    -- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake/ament_cmake_export_dependencies-extras.cmake
    -- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake/ament_cmake_export_include_directories-extras.cmake
    -- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake/ament_cmake_export_libraries-extras.cmake
    -- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake/amba_ctrl_datalinkmsgConfig.cmake
    -- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake/amba_ctrl_datalinkmsgConfig-version.cmake
    -- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/package.xml
    -- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake
    -- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake/register_amba_ctrl_datalinkmsg_implementation.cmake
    -- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake/get_amba_ctrl_datalinkmsg_typesupport.cmake
    -- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake/configure_amba_ctrl_datalinkmsg_library.cmake
    -- Up-to-date: /home/.../install/include/amba_ctrl_datalinkmsg
    -- Installing: /home/.../install/include/amba_ctrl_datalinkmsg/source.h
    -- Installing: /home/.../install/lib/libamba_ctrl_datalinkmsg.a
    -- [ament] Deploying: /home/.../install/local_setup.bash
    -- [ament] Deploying: /home/.../install/local_setup.sh
    -- [ament] Deploying: /home/.../install/local_setup.zsh
    -- [ament] Deploying: /home/.../install/setup.bash
    -- [ament] Deploying: /home/.../install/setup.sh
    -- [ament] Deploying: /home/.../install/setup.zsh
    -- [ament] Deploying: /home/.../install/_order_packages.py
    alex:overlay_ws$ 
    
    删除src和include dir


    感谢@Tsyvarev和其他人。以下是我选择的方式:

    CMakeList.txt

    它与相应的msg/Makefile一起运行

    MSGDEFS=*.msg
    目标=msgGen
    SOURCE=msgGen.cpp
    GENTARGETCPP=../src/DatalinkMsg.cpp
    GENTARGETH=../include/DatalinkMsg.h
    全部:$(GENTARGETCPP)$(GENTARGETH)$(MSGDEFS)$(来源)
    $(GENTARGETCPP):$(MSGDEFS)$(来源)
    制造发电机
    $(gentarges):$(MSGDEFS)$(来源)
    制造发电机
    gen:$(目标)$(MSGDEFS)$(来源)
    mkdir-p../src/
    mkdir-p../include/
    ./$<
    $(目标):msgGen.cpp
    g++$<-o$@--std=c++11
    清洁:
    rm-f$(目标)$(GENTARGETCPP)$(GENTARGETH)
    
    execute\u process()
    发生在配置阶段,即生成阶段之前。您预期会发生什么,然后又发生了什么?我想运行源代码生成。这将在这个CMakelist.txt中为目标生成源,然后我运行cmake'huhu…'从未打印到终端。此外,Makefile的打印输出也不可见。如果我用上面的命令手动运行make,我可以看到输出。
    在检查依赖项之前,似乎没有调用“execute\u process”。
    -“execute\u process”作为配置过程的一部分运行(
    cmake
    call),在这个阶段没有依赖项检查。但是:如果您在已经配置的项目上调用
    make
    ,则只有在
    CMakeLists.txt
    发生更改时才会重新配置。为什么不使用公共
    add\u custom\u target
    /
    add\u custom\u命令
    方法来生成源文件?例如,
    add_custom_命令(输出${CMAKE_CURRENT_SOURCE_DIR}/src/SOURCE.cpp命令make-C…
    add_custom_目标(生成依赖${CMAKE_CURRENT_SOURCE_DIR}/src/SOURCE.cpp)
    添加依赖项(${PROJECT_NAME}generate)
    MSGDEFS = *.msg
    
    TARGET = msgGen
    SOURCE = msgGen.cpp
    
    GENTARGETCPP = ../src/DatalinkMsg.cpp
    GENTARGETH   = ../include/DatalinkMsg.h
    
    all: $(GENTARGETCPP) $(GENTARGETH) $(MSGDEFS) $(SOURCE)
    
    $(GENTARGETCPP): $(MSGDEFS) $(SOURCE)
        make gen
    
    $(GENTARGETH): $(MSGDEFS) $(SOURCE)
        make gen
    
    gen: $(TARGET) $(MSGDEFS) $(SOURCE)
        mkdir -p ../src/
        mkdir -p ../include/
        ./$<
    
    $(TARGET): msgGen.cpp
        g++ $< -o $@ --std=c++11
    
    clean:
        rm -f $(TARGET) $(GENTARGETCPP) $(GENTARGETH)