Компиляция во время выполнения и пользовательский заголовок #include в C++

Мне нужно скомпилировать и связать некоторый код во время выполнения. Я использую подход, предложенный здесь: https://stackoverflow.com/a/10565120/3038460

В основном я пишу свой код в файл .cpp, а затем компилирую с помощью

/usr/bin/g++ -shared mysource.cpp -o libname.so

Все работает нормально, пока я только #include заголовки из стандартных библиотек. Но что, если мне нужно использовать пользовательский класс в «динамическом» коде? Как включить мой собственный заголовок? Файл .cpp временно хранится в том же месте, что и мой двоичный файл, и это может отличаться от местоположения моих исходных файлов. Есть ли способ узнать во время выполнения, где находился исходный код? Я сомневаюсь.

Более того, я хотел бы, чтобы мой код работал, даже если исходный код недоступен.

Чтобы уточнить, mysource.cpp может выглядеть так:

#include <stdlib.h>
#include <vector>
#include "myheader.h"     <---- how can g++ find this file? At runtime,
                                when I create mysource.cpp, I have no idea
                                where myheader.h is located

void f(){
  // Code
}

Какое лучшее решение для решения этой проблемы?


person Marco Ancona    schedule 13.04.2015    source источник
comment
Ваша цель не иметь остального исходного кода на самом деле несовместима с разработкой на C/C++. Обычно вам нужно включать заголовки, потому что вам нужен доступ к определениям типов данных и/или прототипам функций, которые определяют интерфейсы, которые вы хотите использовать. Если эти заголовки недоступны, компилятор не знает, как скомпилировать фрагмент кода, который вы ему даете. C/C++ не предназначены для инкрементной компиляции, когда доступны только двоичные файлы.   -  person Jason R    schedule 14.04.2015
comment
Хорошо... поэтому я думаю, что единственный способ - напечатать содержимое заголовка непосредственно внутри mysource.cpp, взяв его из жестко закодированной строки или скопировав исходный файл с помощью скрипта, как предлагает @Z̷͙̗̻͖̣̹͉̫̬̪̖̤͆ͤ̓ͫͭ̀̐͜͞ͅͅͅαlγo   -  person Marco Ancona    schedule 14.04.2015


Ответы (1)


Сгенерируйте содержимое этого файла заголовка в сгенерированный исходный файл.

Технически директива #include — это просто директива для включения полного содержимого заголовочного файла в тело исходного файла (в частности, в том месте, где вы его включили) во время компиляции. Таким образом, вы можете пропустить посредника и сгенерировать содержимое этого заголовочного файла в исходный файл перед его компиляцией вместо #include

person The name's Bob. MS Bob.    schedule 13.04.2015
comment
Почему бы тогда не добавить содержимое заголовочного файла в начало сгенерированного исходного файла (возможно, ниже других включений)? Это в основном все, что делает заголовочный файл, добавляя свой код в тот момент, когда он был сгенерирован. - person The name's Bob. MS Bob.; 14.04.2015
comment
Я рассмотрел это решение, но это означает, что я должен жестко кодировать заголовок как строку и изменять строку каждый раз, когда я изменяю исходный файл, чтобы сохранить его согласованность. Это не имеет большого значения, но я пытался выяснить, есть ли лучшее решение, потому что, на мой взгляд, это совсем не элегантно. - person Marco Ancona; 14.04.2015
comment
Найдите способ автоматически генерировать эту строку на бэкэнде. - person The name's Bob. MS Bob.; 14.04.2015
comment
Было бы здорово, если бы программа сама генерировала строку с содержимым собственного исходного кода. Но я не думаю, что это возможно. Единственное решение, которое я могу придумать, это запускать скрипт каждый раз, когда программа компилируется, чтобы копировать исходный файл в расположение двоичного файла. Тогда читать оттуда легко. - person Marco Ancona; 14.04.2015
comment
Я не предлагаю сделать программу квайн. :) Но да, я бы добавил в make-файл скрипт, который запускается перед компиляцией. - person The name's Bob. MS Bob.; 14.04.2015