【问题标题】:How to embed CINT into a C++ app on Windows?如何将 CINT 嵌入到 Windows 上的 C++ 应用程序中?
【发布时间】:2012-03-13 12:32:46
【问题描述】:

我想知道如何在 Windows 7 或 NT 上将 CINT 嵌入到 C++ 代码中。

在 windows7 上,我需要编写一个 C++ 程序,它从输入文件中读取 C++ 程序,运行它并计算在运行期间执行了多少行代码。我发现最好的方法是(1)更新读取的程序代码,以便一旦执行其中的命令,计数器值就会增加(对于 return 或 break 等命令,计数器值将在执行前增加), (2) 使用 C++ 解释器执行更新后的程序,一旦返回就读取计数器值。 我希望有其他方法来解决这个问题。

我在网上搜索并发现 CINT 将是正确的解释器(虽然旧)。我从 ROOT 主页下载它,安装它并抛出 TestApp 演示,但构建它时出现链接错误,我没有找到解决方法。因此我需要你的帮助。

如果有人可以为我提供一个在 windows 上将 CINT 嵌入到 C++ 代码中的项目,那最好是这样,这样我就可以在我的机器上进行测试,并找出我的错误。

我也会感谢任何其他有价值的意见。

提前致谢

【问题讨论】:

  • 您遇到的链接器错误是什么?什么编译器(也许是 MSVC)?
  • 感谢您的评论。我正在使用 MSVC 2010。请告诉我,需要调用 makecint 才能将 CINT 嵌入 C++ 代码?我使用二进制发行版安装了 CINT。自述文件指出了此安装的限制:使用二进制分发版,您只能使用 cint C++ 解释器。为了使用 makecint,您必须从源代码编译 cint。我不确定我是否需要 makecint

标签: c++ c windows interpreter embedding


【解决方案1】:

更合理的选择是在阅读源文件时对其进行修改。例如,当这是您的输入时:

void foo() {
  std::cout << "Hello";
  std::cout << " World" << std::endl;
}

你把它变成这样:

static int LineCounter = 0;
extern "C" int getLineCounter() { return LineCounter; }

extern "C" void foo() {
  ++LineCounter;
  std::cout << "Hello";
  ++LineCounter;
  std::cout << " World" << std::endl;
}

并将其传递给编译器。编译成DLL,调用LoadLibraryGetProcAddress("foo")GetProcAddress("getLineCounter")

【讨论】:

  • 感谢您的评论。请让我知道 - 是否可以在运行时编译成 DLL,然后加载 DLL?如果是,那怎么办?
  • 编译部分相当简单——只需调用编译器——最后一行解释了DLL的加载。但是 TBH 如果你需要问这个,整个项目可能比你的工资等级高一点。您知道应该在源代码中的确切位置添加 ++LineCounter 吗?你知道&lt;&lt; std::endl中有多少“命令”吗?
  • 感谢您的评论。这个项目比我的工资等级高一点,所以我请求你的帮助。你能解释一下如何调用编译器吗?此外,我需要在执行给定源中的每一行之后添加一个“++LineCounter”,而不是在执行每个命令之后。对于其执行导致 B 行的 A 行,其中 B 不是 A 在文本中的下一行,我将在 A 行之前添加“++LineCounter”。谢谢
  • 好的我明白了:我需要使用 CreateProcess 运行 cl.exe 以从更新的代码构建 obj 文件,然后调用 CreateProcess 以在创建的 obj 上运行 link.exe,并带有一个标志所以它被创建为一个 DLL,并如上所述从我的代码中调用这个 DLL 功能。 cl 和 link 的命令行选项是什么?
  • CL 可以为你调用链接器。见msdn.microsoft.com/en-us/library/ms235639(VS.80).aspx
猜你喜欢
  • 2011-03-08
  • 2021-12-19
  • 2010-09-08
  • 1970-01-01
  • 1970-01-01
  • 2011-11-22
  • 1970-01-01
相关资源
最近更新 更多