创建和使用动态连接库

摘自http://msdn.microsoft.com/zh-cn/library/ms235636.aspx


一、创建动态连接库

1.  创建一个dll项目

2.  添加一个名为“MyMathFuncs”的简单类,以执行常见的算术运算,如加、减、乘和除。 代码应与以下内容类似:

 示例代码

// MathFuncsDll.h

namespace MathFuncs
{
    class MyMathFuncs
    {
    public:
        // Returns a + b
        static __declspec(dllexport) double Add(double a, double b);

        // Returns a - b
        static __declspec(dllexport) double Subtract(double a, double b);

        // Returns a * b
        static __declspec(dllexport) double Multiply(double a, double b);

        // Returns a / b
        // Throws DivideByZeroException if b is 0
        static __declspec(dllexport) double Divide(double a, double b);
    };
}

请注意此代码方法声明中的 __declspec(dllexport) 修饰符。   这些修饰符使 DLL 能够导出该方法以供其他应用程序使用。   有关更多信息,请参见 dllexport, dllimport


cpp文件

// MathFuncsDll.cpp
// compile with: /EHsc /LD

#include "MathFuncsDll.h"

#include <stdexcept>

using namespace std;

namespace MathFuncs
{
    double MyMathFuncs::Add(double a, double b)
    {
        return a + b;
    }

    double MyMathFuncs::Subtract(double a, double b)
    {
        return a - b;
    }

    double MyMathFuncs::Multiply(double a, double b)
    {
        return a * b;
    }

    double MyMathFuncs::Divide(double a, double b)
    {
        if (b == 0)
        {
            throw new invalid_argument("b cannot be zero!");
        }

        return a / b;
    }
}

在vs中,直接生成即可。

如果在命令行中,使用如下命令

cl.exe /LD filename.cpp


二、使用动态链接库

测试代码先

 
// MyExecRefsDll.cpp
// compile with: /EHsc /link MathFuncsDll.lib

#include <iostream>

#include "MathFuncsDll.h"

using namespace std;

int main()
{
    double a = 7.4;
    int b = 99;

    cout << "a + b = " <<
        MathFuncs::MyMathFuncs::Add(a, b) << endl;
    cout << "a - b = " <<
        MathFuncs::MyMathFuncs::Subtract(a, b) << endl;
    cout << "a * b = " <<
        MathFuncs::MyMathFuncs::Multiply(a, b) << endl;
    cout << "a / b = " <<
        MathFuncs::MyMathFuncs::Divide(a, b) << endl;

    return 0;
}



如果是在vs下面,

  1. 创建新的控制台应用程序后,将为您创建一个空程序。 源文件的名称与您在前面为项目选择的名称相同。 在本示例中,名为“MyExecRefsDll.cpp”。

  2. 若要使用在动态链接库中创建的算术例程,则必须引用该库。 若要执行此操作,请在解决方案资源管理器中选择 MyExecRefsDll 项目,然后从“项目”菜单中选择“引用...” “属性页”对话框中,展开“通用属性”节点,选择“框架和引用”,然后选择“添加新引用...”按钮。 有关“引用...”对话框的更多信息,请参见“<Projectname> 属性页”对话框 ->“通用属性”->“框架和引用”

  3. 显示“添加引用”对话框。 此对话框列出了所有可以引用的库。 “项目”选项卡列出了当前解决方案中的所有项目,以及它们包含的所有库。 “项目”选项卡中,选择 MathFuncsDll。 然后单击“确定”

  4. 若要引用动态链接库的头文件,必须修改包含目录路径。 为此,请在“属性页”对话框中展开“配置属性”节点,然后展开“C/C++”节点,并选择“常规” “附加包含目录”旁边,键入 MathFuncsDll.h 头文件所在位置的路径。

  5. 可执行文件仅在运行时加载动态链接库。 必须告诉系统在哪里查找“MathFuncsDll.dll”。 您可以通过使用 PATH 环境变量做到这一点。 为此,请在“属性页”对话框中展开“配置属性”节点,并选择“调试” “环境”旁边键入以下内容:PATH=<MathFuncsDll.dll 文件的路径>,其中 <MathFuncsDll.dll 文件的路径> 应替换为 MathFuncsDll.dll 的实际位置。 单击“确定”保存所有更改。

如果是在命令行下面,

先编译测试文件,然后再和dll文件链接。所以分两步。命令如下

cl.exe /c MyExecRefsDll.cpp     //得到MyExecRefsDll.obj文件

link MyExecRefsDll.obj  MathFuncsDll.lib      //得到exe文件
注意链接时使用的是MathFuncsDll.lib 而不是MathFuncsDll.dll

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用Python创建动态链接DLL),你可以使用`ctypes`。下面是一个简单的示例: 1. 首先,创建一个Python脚本(例如,`example.py`),并在其中编写你的函数或代码逻辑。 ```python # example.py def add_numbers(a, b): return a + b ``` 2. 使用`cython`将Python代码转换为C代码。你可以使用以下命令安装`cython`: ``` pip install cython ``` 然后,创建一个名为`example.pyx`的文件,其中包含以下内容: ```python # example.pyx def add_numbers(a, b): return a + b ``` 3. 创建一个名为`setup.py`的文件,用于构建和编译动态链接。在其中添加以下代码: ```python # setup.py from distutils.core import setup from Cython.Build import cythonize setup(ext_modules=cythonize("example.pyx")) ``` 4. 打开命令提示符或终端,并导航到包含上述文件的目录。然后运行以下命令来构建和编译动态链接: ``` python setup.py build_ext --inplace ``` 这将生成一个名为`example.so`(Linux / macOS)或`example.dll`(Windows)的动态链接文件。 5. 现在你可以在其他Python脚本中使用这个动态链接。例如,创建一个名为`main.py`的文件,并添加以下代码: ```python # main.py from ctypes import CDLL # 加载动态链接 example = CDLL('./example.so') # 替换为example.dll(Windows) # 调用动态链接中的函数 result = example.add_numbers(2, 3) print(result) ``` 运行`main.py`脚本,将会输出结果 `5`。 这就是使用Python创建动态链接的基本步骤。你可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值