【问题标题】:Advise needed for Static vs Dynamic linking静态与动态链接所需的建议
【发布时间】:2014-07-09 10:07:12
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: python c++ dll static-libraries


    【解决方案1】:

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

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

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

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

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

    如果你能给出一个可靠的例子来说明你的意思,我们就能给你更好的建议。

    【讨论】:

    • 谢谢。是的,我的意思是编辑变量。 “公共接口”是什么意思?
    • +1:我同意。如果您动态链接,我看不到任何好处。恕我直言,静态链接将满足您的需求,因为您只需要运行一个例程然后解析这些结果......您并不是专门指代码中应该从 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()
    

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

    【讨论】:

    • args = ['./executable_name'] 实际上应该是 args = ['your_executable_name_with_path']。对?如果您在通过编译代码创建可执行文件时没有假设,则不能突然假设当前目录中的可执行文件。
    • yes ./ 将在同一目录中查找文件。要运行可执行文件,一个简单而安全的技巧是在 python 中使用沙盒方法,或者最好在 C 中使用 exec。谢谢@Nawaz
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2010-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-09
      • 1970-01-01
      相关资源
      最近更新 更多