В вашем случае (вы хотите, чтобы избежать загромождения дерева сборки), практически полезное решением было бы иметь некоторые конвенции о временных исполняемых файлах.
Например, вы можете решить, что каждый промежуточный исполняемый файл или файл с именем *.tmp
или _*
или *.tmpbin
(для временных бинарных файлов) и имеют некоторые Makefile
правил, которые удаляют их. Или вы можете использовать mktemp(1) в своем Makefile
, чтобы получить временное имя файла. Не забудьте удалить его позже.
Кроме того, в большинстве крупных проектов есть шаг компиляции и шаг установки (часто make install
); и если у вас этого нет, вы, вероятно, должны. Вы хотите, чтобы ваш шаг установки избегал установки временных двоичных файлов или файлов; с некоторыми соглашениями об именах это довольно просто: первая команда для install
фальшивой цели в вашем Makefile
удалит эти временные файлы или файлы.
Кроме того, вы обычно строите дерево файлов, отличное от конечного каталога bin/
, поэтому вы можете оставить временные исполняемые файлы в дереве сборки.
Как несколько человек заметили, убрав свой собственный исполняемый легко на Linux (сделать readlink(2) на "/proc/self/exe"
(см proc(5) подробности), то unlink(2) результат readlink
....), но трудно на Windows.
Так что практически ваш вопрос не является очень важным вопросом ... (если вы используете подходящие соглашения о строительстве). И GCC работают над файлами (потому что он будет запускать ld
для создания этого исполняемого файла); однако GCCJIT скрывает их. AFAIK, вы даже не сможете использовать /dev/stdout
в качестве исполняемого вывода gcc
(но вы можете запустить gcc -x c /dev/stdin
, чтобы скомпилировать код C от stdin).Таким образом, GCC не может избежать возможности сделать исполняемый файл file (но вы могли бы использовать его временно или в файловой системе tmpfs или FUSE). Поэтому вам нужно что-то внешнее для вашей команды gcc
(возможно, просто rm
в следующей строке вашего Makefile
), чтобы удалить созданный исполняемый файл.
Вы также можете решить (dynamically loaded) plugins (например, использовать dlopen(3) на Linux). Ваша основная программа может загрузить плагин (с dlopen
на Linux) - возможно, даже после того, как он динамически сгенерировал свой код на C++ и скомпилировал этот сгенерированный код, например. некоторые shared object.so
на Linux (или DLL на Windows), как я do в MELT - запустите функции в нем получены с dlsym
и выгрузить плагин (с dlclose
на Linux) и, наконец, remove
его. Вы можете использовать кросс-платформенные фреймворки, такие как Qt или POCO, чтобы избежать использования кода плагина, специфичного для ОС.
вы имеете в виду объектный файл? – Jagannath
@Jagannath Я хочу избежать любого двоичного или объектного файла. Просто хочу запустить то, что должно быть построено. – ar2015
lol. Binary - это то, что нужно поддерживать и запускать. – Jagannath