【问题标题】:Including an executable inside a cpp file在 cpp 文件中包含可执行文件
【发布时间】:2018-09-15 15:34:15
【问题描述】:

我一直在开发一个程序,通过测试我发现我可能需要包含一个辅助可执行文件才能与该程序一起运行,这不是一个包含的程序,而是我编写的一个,我在 Google 上搜索为以及在这里,但是,没有文档。我使用 Eclipse 作为我的 IDE,所以我不能使用任何 Visual Studios 工具。 这是一个基于 Windows 的应用程序。

【问题讨论】:

  • 这更多是 安装程序 或平台特定的可执行格式的问题。
  • C++ 不知道什么是可执行文件。您执行此操作的方式取决于您的操作系统约定。
  • 无法以当前形式回答问题。您需要更具体地了解您想要做什么以及您使用的平台。
  • 如果你编写了可执行文件,你大概可以访问它的代码。在那种情况下,为什么不直接使用它的代码呢?
  • 我无法使用可执行文件中的代码,因为它使用 while 循环进行操作,并且它必须与我尝试运行的代码并行运行

标签: c++ windows eclipse


【解决方案1】:

我无法使用可执行文件中的代码,因为它使用了 while 循环 运行,它必须与我尝试运行的代码并行运行

您的意外响应...是什么阻止您将“辅助可执行文件”作为现有可执行文件中的线程运行?


考虑:如果“辅助可执行文件”代码被“打包”为“main()”,(并且您有代码)您可以简单地将“main”重命名为其他名称,也许是“foo()”,也许是 'main2(int, char**)',甚至是 'secondary_executable(int, char**)' ...

// rename secondary executable 'main' to 
void foo(int argc, char* argv[]) 
{
    // example for test purposes ... input echo
    std::cout<< "\n  " << argc;
    for (int i = 1; i<argc; ++i) std::cout << "  " << argv[i];
    std::cout << std::endl;

    // for test purposes - do something for 50 ms
    for (int i = 0; i < 5; ++i) {
        std::cout << "foo executing << "  " << i << std::flush;
        std::this_thread::sleep_for(std::chrono::milliseconds(10));
    }
}

然后,在你的“主要”的某个地方,你做一些类似的事情(未测试,未编译):

std::thread t2(foo, argc, argv); // pass both by value

此语句启动并行运行的线程 (t2)。

如果您必须同步其终止,请添加适当的联接。


这个次要是否需要比原来更多的 argv?

因为 argv 只是一个字符串列表,您可以将新的 argv 添加到您的参数列表中(以及对文档的描述,以及对“使用”用户提示的更新等)


如果您的辅助可执行文件不是 C++(也不是 C),我想考虑的后备方法是从您的 C++ 代码中分叉或 popen() 辅助可执行文件。在 *nix 上,辅助可执行文件将作为并行进程运行,具有管道接口。

【讨论】:

  • Garrett Gutierrez 评论建议的一种可能方法。
  • 很好的解决方案!但是,我遇到了 MinGW 不允许我使用线程编译的问题,所以如果您有解决方法或替代类,请告诉我
  • 更新:我在 Github 上找到了工作头文件,它确实编译了!感谢您的帮助
  • 恭喜。 C++ 线程的一种替代方案可能是“posix 线程”。
  • @stranger080 仅供参考——使用“std::thread”的 C++ 应用程序(在 Ubuntu 17.10 上)将fail在没有具有“-lpthread”的构建命令的情况下进行链接,这也是“posix 线程”所必需的。 C++ 线程代码比 posix 方便得多,但两者都是函数式的。
【解决方案2】:

这更多是 安装程序 或平台特定的可执行格式的问题。

您应该使用操作系统 API 来执行辅助程序。

我建议将您的辅助程序与可执行文件和其他库一起打包。这可以通过使用安装程序实用程序(特定于平台)来执行。

将数据放入可执行文件中超出了标准 C++ 语言的范围。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    • 1970-01-01
    • 2011-10-22
    • 2018-12-28
    • 2016-08-01
    • 1970-01-01
    • 2013-12-25
    相关资源
    最近更新 更多