这可能是xy problem,因此,如果有更好的方法可以解决这个问题,我可以接受偏离原始问题的建议。
我有一个相当大的程序,可以生成许多指标,统计数据等。我需要的一个重要计算是能够生成复杂数学运算的输出。可以生成此输出的唯一工具是供应商提供的第三方应用程序。供应商很乐意为我的公司编译适用于任何OS / distory /架构的应用程序,但他们无法向我们提供源代码。因此,我们的程序必须依赖于作为同一项目的一部分提供的预编译程序,以及通过popen()
启动的供应商程序。
由于安装失误和其他问题,有时候由于路径问题,文件被移动等导致popen()
调用失败等等。这些都是我们无法控制的事情,但是,客户将其归咎于开发者。
在c程序中使用简单的make加linux是否有某种方法可以将外部应用程序嵌入到我们自己的应用程序中,以便它可以popen()
在私有内存映射中进行编辑,以便程序始终可用于我们的" main"应用
理想情况下,我们只需将此程序的源代码添加到我们自己的代码库中并解决问题,但我们无法使用。
答案 0 :(得分:4)
如果您确实必须将应用程序作为单个二进制文件发送而没有辅助文件 1 ,则可以使用链接器将整个二进制文件链接到应用程序中。 Linux / ELF / ld
的具体细节已充实in this answer。
然后,在运行时,只需将二进制文件写入临时文件,然后chmod(2)
以编程方式将权限包括在执行中,最后popen
将其写为您正在执行的操作。
1 因为如果不是必需的,供应商提供的应用程序可以被视为必须存在的任何其他辅助文件。我不知道客户如何比应用程序目录中的其他文件更容易搞乱可执行文件。
答案 1 :(得分:1)
这确实是一个有趣的问题。我要做的是在程序中包含可执行文件。最简单的方法是创建一个chars数组,它是可执行文件内容的副本。然后,在运行时,使用mkstemp
创建临时文件并在其中写入char数组的内容。然后,您可以使用chmod
添加执行权限,并使用popen
运行,就像您之前一样。
我发现这个问题提供了一个代码示例来完成我所描述的内容:How to compile and execute from memory directly?