【问题标题】:Compiling at runtime and #include custom header in C++在运行时编译和 C++ 中的#include 自定义标头
【发布时间】:2015-04-14 08:24:33
【问题描述】:

我需要在运行时编译和链接一些代码。我正在使用这里建议的方法: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
}

解决此问题的最佳解决方案是什么?

【问题讨论】:

  • 您不提供其余源代码的目标与 C/C++ 开发并不真正兼容。您通常需要包含标头,因为您需要访问定义您想要使用的接口的数据类型定义和/或函数原型。如果这些标头不可用,则编译器不知道如何编译您提供的代码 sn-p。当只有二进制文件可用时,C/C++ 不能进行增量编译。
  • 好的...所以我想唯一的方法是直接在mysource.cpp 内打印标题的内容,从硬编码字符串中获取它或使用脚本复制源文件作为建议@Z̷͙̗̻͖̣̹͉̫̬̪̖̤͆ͤ̓ͫͭ̀̐͜͞ͅͅαлγo

标签: c++ c header-files dlopen runtime-compilation


【解决方案1】:

将该头文件的内容生成到生成的源文件中。

从技术上讲,#include 指令只是一个指令,用于在编译时将头文件的全部内容包含在源文件的主体中(特别是在包含它的位置)。因此,您可以跳过中间人并在编译之前将该头文件的内容生成到源文件中,而不是 #include

【讨论】:

  • 为什么不将头文件的内容添加到生成的源文件的顶部(可能在其他包含下方)?这基本上就是一个头文件所做的一切,在它生成的地方添加它的代码。
  • 我考虑过这个解决方案,但这意味着我应该将标题硬编码为字符串,并在每次更改源文件时修改字符串以保持一致。这没什么大不了的,但我试图弄清楚是否有更好的解决方案,因为我认为这根本不优雅
  • 然后找到一种在后端自动生成该字符串的方法。
  • 如果程序本身可以生成带有自己源代码内容的字符串,那就太好了。但我认为这是不可能的。我能想到的唯一解决方案是每次编译程序时运行一个脚本,将源文件复制到二进制文件的位置。然后从那里阅读很容易。
  • 我不建议将程序设为 quine。 :) 但是,是的,我会在 makefile 中添加一个在编译之前运行的脚本。
猜你喜欢
  • 1970-01-01
  • 2012-05-08
  • 2019-06-18
  • 2014-07-19
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多