2014-12-13 44 views
-9

我正在进行机器人仿真,并且要控制机器人(在仿真中),我们必须在称为插件的文件中编写C++代码。如何以编程方式运行make&CMake

为了编译我们使用CMake的插件,我们在终端中编写命令。

现在,我想要的是编译大量的插件(数百个)一个接一个地测试使用遗传算法的最佳控制器。

我不能手动执行此操作(即对于每个插件,在终端中写入CMake命令),所以我想编写将编译所有插件的C++代码。

+2

你是什么意思_automatically_?时间安排?或者作为更新或安装的分布式软件包?我没有得到你真正要求的。 – 2014-12-13 16:53:15

+0

这是你在找什么http://m.wikihow.com/Compile-a-C/C%2B%2B-Program-on-Ubuntu-Linux – 2014-12-13 16:54:25

+0

没必要一个C++文件。我希望不要输入cmake并在终端上编写命令,而是在执行该文件时,它会在运行时编译另一个C++文件。 – user1931907 2014-12-13 17:00:16

回答

0

我不知道我完全理解你的问题,但我会以一个答案:)

您可以创建由CMake的配置一个新的C++项目刺伤。 CMake会将您的C++代码所需的所有路径写入C++源文件。比方说,新项目具有以下结构:

/CMakeLists.txt 
/PluginAlpha 
    /CMakeLists.txt 
    /... 
/PluginBeta 
    /CMakeLists.txt 
    /... 
/PluginGamma 
    /CMakeLists.txt 
    /... 
/main.cpp 

顶层的CMakeLists.txt可以这样做:

cmake_minimum_required(VERSION 3.0 FATAL_ERROR) 
project(Builder) 

set(Plugins PluginAlpha PluginBeta PluginGamma) 
foreach(Plugin ${Plugins}) 
    set(Contents "${Contents}\n {\"\\\"${CMAKE_BINARY_DIR}/Build${Plugin}\\\"\", \"\\\"${CMAKE_SOURCE_DIR}/${Plugin}\\\"\"},") 
endforeach() 
string(REGEX REPLACE ",$" "" Contents "${Contents}") 

file(WRITE "${CMAKE_BINARY_DIR}/always_updated/paths.hpp" "#ifndef PATHS_HPP_ 
#define PATHS_HPP_ 

#include <array> 
#include <string> 
#include <vector> 

const std::vector<std::array<std::string, 2>> paths = {${Contents} 
}; 

#endif // PATHS_HPP_ 
") 
configure_file("${CMAKE_BINARY_DIR}/always_updated/paths.hpp" "${CMAKE_BINARY_DIR}/generated/paths.hpp" COPYONLY) 

add_executable(Builder main.cpp "${CMAKE_BINARY_DIR}/generated/paths.hpp") 
target_include_directories(Builder PRIVATE "${CMAKE_BINARY_DIR}/generated") 

所以,作为配置项目的一部分,这个写一个C++头定义每个插件的构建和源代码路径的集合 - 例如

#ifndef PATHS_HPP_ 
#define PATHS_HPP_ 

#include <array> 
#include <string> 
#include <vector> 

const std::vector<std::array<std::string, 2>> paths = { 
    {"\"E:/build/BuildPluginAlpha\"", "\"E:/PluginAlpha\""}, 
    {"\"E:/build/BuildPluginBeta\"", "\"E:/PluginBeta\""}, 
    {"\"E:/build/BuildPluginGamma\"", "\"E:/PluginGamma\""} 
}; 

#endif // PATHS_HPP_ 

然后,您可以有main.cpp中做这样的事情:

#include <cstdlib> 
#include <iostream> 
#include <string> 
#include <vector> 

#include "paths.hpp" // Generated by CMake during configuration 

struct Results { 
    std::string plugin_id; 
    int configure_result, build_result; 
}; 

int main() { 
    std::vector<Results> results; 
    for (const auto& p : paths) { 
    const std::string& build_folder = p[0]; 
    const std::string& source_folder = p[1]; 

    results.emplace_back(); 
    results.back().plugin_id = source_folder; 

    std::string command = "cmake -B" + build_folder + " -H" + source_folder; 
    results.back().configure_result = std::system(command.c_str()); 

    command = "cmake --build " + build_folder + " --config Release"; 
    results.back().build_result = std::system(command.c_str()); 
    } 

    std::cout << "\n\n"; 
    for (const auto& r : results) { 
    std::cout << "Results for " << r.plugin_id << ":\n"; 
    std::cout << " configure result: " << r.configure_result << '\n'; 
    std::cout << " build result:  " << r.build_result << '\n'; 
    } 
    return 0; 
} 

现在,如果你运行该程序“生成器”,它应该配置和构建每个插件。

这是一个简化的例子 - 您可能必须将额外的参数传递给CMake命令,或者想要使用比std::system更好的东西,但这可能会给您一个总体思路。由于您的问题非常模糊,我没有详细介绍上述代码的所有细节;随时提出更多具体的问题。

+0

感谢您的回答,这将帮助我很多。实际上我使用的是Ubuntu 12.04,之前从未使用过CMake。对于插件,我将在main.cpp的执行过程中生成它们,以便它们变得可变...我会尝试一下你的想法,然后我会问一个更具体的问题 – user1931907 2014-12-14 10:36:21

+0

不用担心。 CMake v3.0的文档是[here](http://www.cmake.org/cmake/help/v3.0/index.html)。 – Fraser 2014-12-14 13:39:51

相关问题