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

3 投票
3 回答
2332 浏览
提问于 2025-04-18 12:37

我有一段Python代码,需要能够执行一段C++代码。我对创建库这个概念还很陌生,但根据我目前了解到的,我需要知道是使用静态链接还是动态链接。

我查阅了一些关于这两者的优缺点,但里面有很多我还不太懂的术语。因为我需要尽快解决这个问题,所以我希望能有人简单明了地给我解释一下。

现在的情况是,我的C++代码会生成一些包含数据的文本文件。然后,我的Python代码会使用这些文本文件来绘制数据。作为开始,我需要能够直接从Python运行C++代码。DLL(动态链接库)比SL(静态库)更合适吗?还是我完全走错了方向?

额外问题:是否可以直接从Python编辑我的C++代码中的变量,编译它并执行?

3 个回答

1

我不太明白你提到的“链接”这个概念和你问的问题有什么关系,但听起来你想用类似于SWIG的工具。这个工具可以让你为C++的函数(还有其他很多语言)创建一个“包装”,这样你就可以直接在Python代码中调用它们。

补充:我能否在我的C++代码中编辑值,然后直接从Python编译和执行它?

如果我理解得没错,你是想用Python来修改你的C++代码,然后编译并执行它?如果是这样的话,你可能需要看看如何在你的C++程序中嵌入Python解释器。这意味着你要反过来做,让C++来运行你的Python脚本,而不是试图从Python做所有事情。

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

此外,你还可以处理更多的情况,设计出更高效的方案。

5

这要看你想怎么部署了。如果你使用动态链接,就需要仔细管理你路径上的库文件(比如 .so.dll),确保加载的是正确的版本。如果你在文件名中加入版本号,这会有帮助,但这样也会带来其他问题(比如安全性……显示代码的版本号其实不是个好主意)。另外一个好处是,只要接口不变,你可以在不重新编译的情况下更换库的功能。

静态链接在概念上和实际操作上都更简单。你只需要部署一个文件(比如一个 .exe 文件)。我建议你先从这个开始,直到你需要使用更复杂的共享库设置。

补充一下:我不太明白你提到的“额外奖励”问题。你说的“编辑值”是什么意思?如果你是问能否修改在C++代码中声明的变量,那是可以的,只要你使用公共接口的一部分来做到这一点。顺便说一下,这些建议是针对一般情况的。如果你是从Python链接到C/C++,我觉得你需要使用共享库。不过我不太确定,因为我自己没有这样做过。

补充:关于“公共接口”的解释。当你创建一个C++库时,你需要指定哪些函数可以被外部类调用(可以查一下怎么做)。这就是我所说的公共接口。库中的某些部分是无法访问的,但其他你指定的部分可以被客户端代码(也就是你的Python脚本)调用。这让你可以修改存储在内存中的值。

如果你真的是想从Python内部编辑实际的C++代码,我建议你重新设计你的应用程序。你应该能够通过提供合适的配置来定制C++库的运行时行为。

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

撰写回答