Windows使用MSVC,命令行编译,链接64位dll,Python调用

57 篇文章 1 订阅
76 篇文章 9 订阅


前一篇博客: Windows下使用Visual Studio自带的MSVC,命令行编译C/C++程序


代码

mylib.h代码如下:

#ifndef MYLIB_H
#define MYLIB_H

#if defined(BUILDING_MYLIB)
#define MYLIB_API __declspec(dllexport) __stdcall
#else
#define MYLIB_API __declspec(dllimport) __stdcall
#endif

#ifdef __cplusplus
extern "C" {
#endif

int MYLIB_API helloworld(void);

#ifdef __cplusplus
}
#endif

#endif

mylib.c代码如下:

#include "mylib.h"
#include <stdio.h>

int MYLIB_API helloworld(void)
{
    printf("Hello World DLL");
    return 42;
}

main.c 代码如下:

/* No need to include this if you went the module definition
 * route, but you will need to add the function prototype.
 */
#include "mylib.h"

int main(void)
{
    helloworld();
    return (0);
}

编译

打开64位的x64 Nativate Tools Command Prompt for VS 2019

先编译dll:

C:\Users\peter>cl /DBUILDING_MYLIB mylib.c /LD
用于 x64 的 Microsoft (R) C/C++ 优化编译器 19.22.27905版权所有(C) Microsoft Corporation。保留所有权利。

mylib.c
Microsoft (R) Incremental Linker Version 14.22.27905.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:mylib.dll
/dll
/implib:mylib.lib
mylib.obj
  正在创建库 mylib.lib 和对象 mylib.exp

可以看到编译产生了dllexplibobj四个文件。

链接

然后链接:

C:\Users\peter>cl main.c /link mylib.lib
用于 x64 的 Microsoft (R) C/C++ 优化编译器 19.22.27905 版

main.c

/out:main.exe
mylib.lib
main.obj

可以运行了:

C:\Users\peter>main.exe
Hello World DLL

Python调用

Python调用代码如下:

import os
import sys
from ctypes import *

lib = cdll.LoadLibrary('mylib.dll')

# Our 'ctypes' wrapper around the DLL function -- this is where we
# convert Python types to C types and call the DLL function.
def print_helo():
    func = lib.helloworld
    func()


print_helo()

参考:c - What are the exact steps for creating and then linking against a Win32 DLL on the command line? - Stack Overflow

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页

打赏作者

淡竹云开

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值