我正在進行機器人仿真,並且要控制機器人(在仿真中),我們必須在稱爲插件的文件中編寫C++代碼。如何以編程方式運行make&CMake
爲了編譯我們使用CMake的插件,我們在終端中編寫命令。
現在,我想要的是編譯大量的插件(數百個)一個接一個地測試使用遺傳算法的最佳控制器。
我不能手動執行此操作(即對於每個插件,在終端中寫入CMake命令),所以我想編寫將編譯所有插件的C++代碼。
我正在進行機器人仿真,並且要控制機器人(在仿真中),我們必須在稱爲插件的文件中編寫C++代碼。如何以編程方式運行make&CMake
爲了編譯我們使用CMake的插件,我們在終端中編寫命令。
現在,我想要的是編譯大量的插件(數百個)一個接一個地測試使用遺傳算法的最佳控制器。
我不能手動執行此操作(即對於每個插件,在終端中寫入CMake命令),所以我想編寫將編譯所有插件的C++代碼。
我不知道我完全理解你的問題,但我會以一個答案:)
您可以創建由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
更好的東西,但這可能會給您一個總體思路。由於您的問題非常模糊,我沒有詳細介紹上述代碼的所有細節;隨時提出更多具體的問題。
感謝您的回答,這將幫助我很多。實際上我使用的是Ubuntu 12.04,之前從未使用過CMake。對於插件,我將在main.cpp的執行過程中生成它們,以便它們變得可變...我會嘗試一下你的想法,然後我會問一個更具體的問題 – user1931907 2014-12-14 10:36:21
不用擔心。 CMake v3.0的文檔是[here](http://www.cmake.org/cmake/help/v3.0/index.html)。 – Fraser 2014-12-14 13:39:51
你是什麼意思_automatically_?時間安排?或者作爲更新或安裝的分佈式軟件包?我沒有得到你真正要求的。 – 2014-12-13 16:53:15
這是你在找什麼http://m.wikihow.com/Compile-a-C/C%2B%2B-Program-on-Ubuntu-Linux – 2014-12-13 16:54:25
沒必要一個C++文件。我希望不要輸入cmake並在終端上編寫命令,而是在執行該文件時,它會在運行時編譯另一個C++文件。 – user1931907 2014-12-13 17:00:16