静态链接与动态链接的建议

Advise needed for Static vs Dynamic linking

本文关键字:链接 动态 静态      更新时间:2023-10-16

我有一个Python代码,需要能够执行一个c++代码。我对创建库的想法很陌生,但是从我学到的到目前为止,我需要知道我是否需要使用静态或动态链接。

我已经阅读了两者的利弊,但是有很多术语我还不理解,因为我需要尽快做这件事,我想知道是否有人可以简单地向我解释一下。

情况是这样的。我的c++代码生成了一些包含数据的文本文件。然后,我的Python代码使用这些文本文件绘制数据。作为初学者,我需要能够从Python直接运行c++代码。DLL比SL更合适吗?还是我完全搞错了方向?

额外:是否有可能在我的c++代码中编辑变量,编译并执行它,全部直接从Python?

这取决于您想要的部署。如果使用动态链接,则需要仔细管理路径上的库(.so.dll),并确保加载了正确的版本。如果在文件名中包含版本号,这可能会有所帮助,但这也有其自身的问题(安全…显示代码的版本号是个坏主意)。另一个好处是,只要接口没有改变,就可以在不重新编译的情况下交换库的功能。

静态链接在概念上和实践上都更简单。您只需要部署一个工件(例如.exe)。我建议您从开始,直到您需要移动到更复杂的共享库设置。 编辑:我不明白你的"额外学分"问题。你说的"编辑值"是什么意思?如果你的意思是你可以修改在c++代码中声明的变量,那么是的,你可以,只要你使用部分公共接口来做这件事。顺便说一句,这个建议是为一般的决定。如果你从Python链接到C/c++,我认为你需要使用共享库。我不确定,因为我自己没做过。

编辑:展开"公共接口"。当您创建任何类型的c++库时,您都要指定外部类可以使用哪些函数(请查看如何使用这些函数)。这就是我所说的公共接口。你的库的一部分是不可访问的,但其他(你指定的)可以从客户端代码(即你的python脚本)调用。这允许您修改存储在内存中的值。

如果你真的想在你的python中编辑实际的c++代码,我建议你应该重新设计你的应用程序。您应该能够通过提供适当的配置来定制您的c++库的运行时行为。

如果你能给出一个具体的例子,我们就能给你更好的建议。

这是可能的!

尝试在python中探索子进程模块。

下面可以是您的场景的示例实现:

yourfile.cpp
#compilation
args = ['g++','-o','your_executable_name_with_path','yourfile.cpp_with_path']
your_compile = subprocess.Popen(args,stdin=subprocess.PIPE,stderr=subprocess.PIPE,stdout=subprocess.PIPE)
output,compilation_error = your_compile.communicate()
your_compile.wait()
#successful compilation then there will be execuatble
if not compilation_error:
    #execuation
    args = ['your_executable_name_with_path'] #command to run a an execuatble
    your_run = subprocess.Popen(args,stdin=subprocess.PIPE,stderr=subprocess.PIPE,stdout=subprocess.PIPE)
    your_code_output,runtime_error = your_run.communicate()
    your_run.wait()

此外,您可以处理更多的情况,并提出一个有效的设计

我不太确定链接的想法是如何进入你所问的,但听起来你想使用像SWIG这样的东西,它允许你在c++函数(和许多其他语言)周围创建包装器,然后你可以直接从Python代码调用。

额外:是否有可能在我的c++代码中编辑值,编译它并直接从Python执行?

如果我理解正确,你想用Python来改变你的c++代码,然后编译和执行它?如果是这种情况,您可能需要考虑在c++程序中嵌入Python解释器。这意味着用另一种方式来做事情,让c++运行你的Python脚本,而不是试图从Python做所有的事情。