Построение исполняемого файла нетривиально. Сначала вам необходимо выполнить ABI целевых операционных систем, чтобы он мог найти точку входа вашей программы. Следующим шагом будет решение о том, как ваша программа будет иметь доступ к системным ресурсам: вероятно, вы захотите, чтобы исполняемый файл реализовал динамическую компоновку, чтобы иметь доступ к общим библиотекам, и вам нужно загрузить различные DLL или. поэтому файлы вам понадобятся. Все инструкции, которые вам нужно написать для этого, будут отличаться от ОС к ОС, вам может потребоваться ввести логику для определения точной платформы и принятия обоснованных решений, и вам нужно будет варьироваться от 32 до 64 бит.
На этом этапе вы готовы начать выдавать машинные инструкции для своей игры.
Разумная альтернатива здесь (как это сделано Unity) для обеспечения «пустого» исполняемого файла вашим двигателем. Сам ваш движок будет общей библиотекой (.dll или .so), а пустой исполняемый файл будет просто оболочкой, которая загружает общую библиотеку и вызывает в ней функцию с указателем на что-то в этом разделе данных.
Создание исполняемого файла пользователя будет включать загрузку соответствующего пустого места, внесение в него изменений для конкретной платформы, чтобы указать размер раздела данных, которое вы предназначили для его предоставления, и записать ваши данные в соответствующем формате.Или вы могли бы просто иметь пробел, который имеет встроенную копию структуры исходной, в котором вы пишете значения, так же, как заполнение структуры в памяти:
struct GameDefinition {
constexpr size_t AuthorNameLen = 80;
char author_[AutherNameLen+1];
constexpr size_t PublisherNameLen = 80;
char publisher_[PublisherNameLen+1];
constexpr size_t GameNameLen = 80;
char name_[GameNameLen+1];
constexpr size_t QuestionLen = 80;
constexpr size_t AnswerLen = 80;
char question_[QuestionLen+1];
char answer_[AnswerLen+1];
};
static GameDefinition gameDef;
#include "engine_library.h" // for run_engine
int main() {
run_engine(&gameDef);
}
Вы бы скомпилировать этот againsst общих библиотек заглушки для ваш движок и испускайте его как исполняемый файл, тогда вы будете искать подробные сведения о исполняемом формате для конкретной платформы, найдите в нем позицию «gameDef». Вы читали пустоту в памяти и записывали ее с заменой определения «gameDef» на тот, который основан на пользовательском вводе.
Но то, что многие двигатели делают, просто отправляет или требует от пользователя установки компилятора (Unity полагается на C#). Поэтому вместо того, чтобы настраивать исполняемые файлы и выполнять все эти сумасшедшие вещи, специфичные для платформы, они просто выводят программу C/C++ и компилируют ее.
// game-generator
bool make_game(std::string filename, std::string q, std::string a) {
std::ostream cpp(filename + ".cpp");
if (!cpp.is_open()) {
std::cerr << "open failed\n";
return false;
}
cpp << "#include <engine.h>\n";
cpp << "Gamedef gd(\"" << gameName << "\", \"" << authorName << \");\n";
cpp << "int main() {\n";
cpp << " gd.q = \"" << q << \"\n";
cpp << " gd.a = \"" << a << \"\n";
cpp << " RunGame(gd);\n";
cpp << "}\n";
cpp.close();
if (!invoke_compiler(filename, ".cpp")) {
std::cerr << "compile failed\n";
return false;
}
if (!invoke_linker(filename)) {
std::cerr << "link failed\n";
return false;
}
}
Если «RunGame» не является частью вашего двигателя, но поставляемый пользователь, то вы могли бы излучать, что в качестве части коды CPP. В противном случае, намерение здесь состоит в том, что он звонит в вашу библиотеку.
Под Linux вы можете скомпилировать это с
g++ -Wall -O3 -o ${filename}.o ${filename}.cpp
, а затем
g++ -Wall -O3 -o ${filename} ${filename}.o -lengine_library
, чтобы связать его с библиотекой вашего двигателя.
Вы пытались помещать данные Клиента в файл данных, а не в исполняемый файл? –
Почему вы хотите, чтобы мелочи исполнялись? Собираетесь ли вы * выполнить * данные о мелочах? * (Обычно данные не выполняются, но читаются или записываются программой.) * –
Файл данных может быть установлен вместе с исполняемым файлом. Многие программы установки могут создавать установки, которые включают исполняемые файлы и файлы данных. –