2015-04-13 2 views
1

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

В основном я пишу свой код в файл .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 
} 

Что самое лучшее решение, чтобы решить эту проблему?

+0

Ваша цель не иметь остальной доступный исходный код на самом деле несовместима с разработкой C/C++ , Обычно вам необходимо включить заголовки, потому что вам нужен доступ к определениям типов данных и/или прототипам функций, которые определяют интерфейсы, которые вы хотите использовать. Если эти заголовки недоступны, компилятор не знает, как скомпилировать фрагмент кода, который вы ему даете. C/C++ не предназначены для инкрементальной компиляции, когда доступны только двоичные файлы. –

+0

Хорошо ... поэтому я предполагаю, что единственный способ - напечатать содержимое заголовка непосредственно внутри 'mysource.cpp', взяв его из стробированной строки или скопировать исходный файл со сценарием, как это предлагает @ Z̷͙̗̻͖̣̹͉̫̬̪̖̤͆ͤ̓ͫͭ̐͜͞αлγo – Marco

ответ

0

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

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

+0

Почему бы не добавить содержимое файла заголовка в начало сгенерированного исходного файла, а затем (возможно, ниже других)? В любом случае, это все файл заголовка, добавив его код в том месте, где он был сгенерирован. –

+0

Я рассматривал это решение, но это означает, что я должен жестко кодировать заголовок как строку и изменять строку каждый раз, когда я изменяю исходный файл, чтобы он был согласован. Это неважно, но я пытался выяснить, есть ли лучшее решение, потому что это, по-моему, не очень элегантно. – Marco

+0

Найдите способ автоматически сгенерировать эту строку на сервере. –

Смежные вопросы