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

3
我有一个Python代码,需要能够执行C++代码。我对创建库的想法很新,但从我现在所学到的知识来看,我需要知道是否需要使用静态链接还是动态链接。
我已经了解了两者的优缺点,但是有很多术语我目前还不理解。由于我需要尽快完成这个任务,我想知道是否有人能用简单的方式解释一下。
这里是情况。我的C++代码生成一些包含数据的文本文件。然后,我的Python代码使用这些文本文件来绘制数据。首先,我需要能够直接从Python运行C++代码。 DLL比SL更合适吗?还是我完全走错了方向?
额外的问题:是否可以直接从Python编辑变量、编译并执行我的C++代码?
3个回答

5
这取决于你想要的部署方式。如果你使用动态链接,就需要仔细管理路径上的库文件(.so.dll),并确保正确的版本被加载。如果在文件名中包含版本号,可以帮助解决这个问题,但这也会带来其他问题(安全性…显示代码版本号不是一个好主意)。另一个好处是,只要接口不变,你就可以在不重新编译的情况下交换库功能。
静态链接在概念上和实际上都更简单。你只需要部署一个工件(例如.exe)。我建议你从这方面开始,直到你需要转向更复杂的共享库设置。
编辑:我不理解你的“额外学分”问题。你的“编辑值”是什么意思?如果你的意思是可以修改在C++代码中声明的变量,那么只要你使用公共接口的一部分即可完成。
顺便说一句,这个建议适用于普遍决策。如果你正在从Python链接到C/C++,我认为你需要使用共享库。我自己没有做过,不太确定。
编辑:扩展“公共接口”的内容。当你创建任何类型的C++库时,你要指定哪些函数对外部类可用(查找如何做到这点)。这就是我所说的公共接口。你库中的某些部分是不可访问的,但其他部分(由你指定的那些)可以从客户端代码(即Python脚本)调用。这允许你修改存储在内存中的值。
如果你确实意味着要从你的Python中编辑实际的C++代码,我建议你重新设计你的应用程序。通过提供适当的配置,你应该能够自定义C++库的运行时行为。
如果你能给出一个具体的例子来解释你的意思,我们会给你更好的建议。

谢谢。是的,我确实是指编辑变量。你所说的“public interface”是什么意思? - turnip
+1:我同意。如果你动态链接,我不认为会有任何好处。在我看来,静态链接将满足你的需求,因为你只需要运行一个例程,然后解析这些结果...你并不是特别引用代码内应从Python调用的函数(动态链接)。 - lifeOfPI

2

没问题!

试试用Python的subprocess模块。

以下是你所需场景的示例实现:

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()

此外,你可以处理更多的情况并想出高效的设计。

1
args = ['./executable_name'] 实际上应该是 args = ['带路径的可执行文件名']。对吗?如果在编译代码创建可执行文件时没有假设它在当前目录中,则不能突然假设它在当前目录中。 - Nawaz
是的,./将在相同的目录中查找文件。运行可执行文件的一个简单而安全的技巧是使用沙盒方法,可以在Python或更好地在C中使用exec。谢谢@Nawaz。 - gmfreak

1
我不太确定链接的概念与您的问题有何关联,但听起来您想使用类似 SWIG 的工具,它允许您在 C++ 函数(以及许多其他语言)周围创建包装器,然后可以直接从 Python 代码中调用它们。
附加信息:是否可以在我的 C++ 代码中编辑值,编译它并直接从 Python 中执行它?
如果我理解正确,您希望使用 Python 更改您的 C++ 代码,然后编译并执行它?如果是这种情况,您可能需要研究一下 将 Python 解释器嵌入 到您的 C++ 程序中。这意味着要反过来做事情,并让 C++ 运行您的 Python 脚本,而不是尝试从 Python 中完成所有操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接