静态与动态链接需要建议

时间:2014-07-09 10:07:12

标签: python c++ dll static-libraries

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

我已经阅读了两者的优点和缺点,但有很多行话被抛出,我还不明白,因为我需要尽快这样做,我想知道是否可以从某人那里得到一些亮点谁能简单地向我解释一下。

所以这就是情况。我的C ++代码生成一些包含数据的文本文件。然后我的Python代码使用这些文本文件来绘制数据。作为入门者,我需要能够直接从Python运行C ++代码。 DLL比SL更合适吗?还是我咆哮着完全错误的树?

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

3 个答案:

答案 0 :(得分:5)

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

静态链接在概念上更简单,实际上更简单。您只需要部署一个人工制品(例如.exe)。我建议您从此开始,直到您需要转移到更复杂的共享库设置。

编辑:我不明白你的“额外信用”问题。 “编辑值”是什么意思?如果您的意思是可以修改在C ++代码中声明的变量,那么只要您使用部分公共接口来执行它就可以。 顺便说一句,这个建议是为了一般性的决定。如果您从Python链接到C / C ++,我认为您需要使用共享库。不确定,因为我自己没有这样做。

编辑:扩展“公共界面”。当您创建任何类型的C ++库时,您可以指定外部类可用的函数(查找如何使用它)。这就是我所说的公共界面。您的库的某些部分是不可访问的,但是其他(您指定的)可以从客户端代码(即您的python脚本)调用。这允许您修改存储在内存中的值。

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

如果你举一个可靠的例子,我们就能给你更好的建议。

答案 1 :(得分:2)

是的,有可能!!

尝试在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()

此外,您可以处理更多案例并提出有效的设计

答案 2 :(得分:1)

我不太确定链接的想法是如何产生你所要求的,但我觉得你想要使用类似SWIG的东西,它允许你创建围绕C ++函数的包装器(以及许多其他语言),然后可以直接从Python代码中调用它们。

  

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

如果我正确理解这一点,您想使用Python来更改C ++代码,然后编译并执行它吗?如果是这种情况,您可能需要在C ++程序中查看embedding the Python interpreter。这意味着反过来做事情并让C ++运行你的Python脚本,而不是试图从Python做所有事情。