.dll文件:使用了動(dòng)態(tài)鏈接, 運(yùn)行時(shí)(windows平臺(tái))需要的文件
.lib: 使用了鏈接,編譯時(shí) 需要的文件

新建c++ lib項(xiàng)目,記得選share而不是static
沒有二級(jí)目錄
library.h
#ifndef MAKE_DLL_LIBRARY_H
#define MAKE_DLL_LIBRARY_H
#define MAKE_DLL_API __declspec(dllexport)
int MAKE_DLL_API hello(); 
#endif //MAKE_DLL_LIBRARY_Htip: 加
#pragma once跟加1、2行和倒數(shù)一行的效果相同
__declspec(dllexport) 這是必須要的,否則其他的cmake項(xiàng)目調(diào)用hello()會(huì)有不報(bào)錯(cuò)的錯(cuò)誤
library.cpp
#include "library.h"
int hello() {
    return 0;
}CMakeLists.txt
cmake_minimum_required(VERSION 3.23)
project(make_dll)
set(CMAKE_CXX_STANDARD 14)
add_library(make_dll SHARED library.h library.cpp)編譯
二. 查看dll 信息由于一般使用64位的python,所以需要選擇64位的編譯
1. 判斷是 32位還是64位使用命令dumpbin
用記事本打開dll文件
在前幾行找字符串 PE
后面接有 L 就是32位,是 d 就是64位
clion ->file ->setting
我用的是visual studio自帶的,可以在右邊Architechture切換版本,x86是32位,amd不知什么東西
用軟件查看,百度搜DLL Export Viewer,官網(wǎng)的最新版本(currentTime: 2023/01)好像有問題,在其他網(wǎng)站下就行了
如果沒有使用__declspec(dllexport)將函數(shù)導(dǎo)出,dll文件中就沒有內(nèi)容
一般情況下把測試程序目錄放在項(xiàng)目目錄下 同時(shí)改cmake就行了,不需要新建項(xiàng)目,但這里是新建了項(xiàng)目
直接看CMakeLists.txt
cmake_minimum_required(VERSION 3.23)
project(test_dll)
set(CMAKE_CXX_STANDARD 14)
message(${PROJECT_SOURCE_DIR}) # 查看變量
include_directories(${PROJECT_SOURCE_DIR}) # 指定外部頭文件路徑
link_directories(${PROJECT_SOURCE_DIR}) # 指定lib文件路徑
add_executable(test_dll main.cpp) # 可執(zhí)行文件,生成exe
target_link_libraries(test_dll make_dll.lib) # 鏈接#
# 動(dòng)態(tài)鏈接時(shí),dll文件要放到exe的同級(jí)目錄或其他目錄, 靜態(tài)庫不用,編譯時(shí)寫進(jìn)去了四. python ctypes調(diào)用dll文件使用ctype庫更加方便
_dll_path = r'makd_dll.dll'
lib = ctypes.cdll.LoadLibrary(_dll_path)
lib.hello()但似乎只能調(diào)用c編寫的dll文件,調(diào)用c++編寫的東西會(huì)出錯(cuò),函數(shù)前要加extern "C"
頭文件要這樣導(dǎo)出函數(shù)
extern "C" __declspec(dllexport) void hello();
//或者
extern "C" {
	__declspec(dllexport) void hello();
}關(guān)于ctypes方式下 的c++接口規(guī)范這規(guī)范是自己試出來的,可能還需要改進(jìn)
有了規(guī)范就不需要用python來測試接口,直接用c++來調(diào)試就行了
dll = ctypes.cdll.LoadLibrary(dll_path)
dll.get_sim.restype = simType //沒有指定*void類型將獲得int類型的值
sim = self.dll.get_sim()void setData(float* points);這將出現(xiàn)一個(gè)問題,無法得知points的長度
可以約定points[0]表示數(shù)組的長度,或者
void setData(float* points, int point_len);float* getArray(){
	float result[4];
	result[0] = 10;
	return result;
}這個(gè)函數(shù)在c++中得到的result[0] 為10,但python調(diào)用dll得到的卻是個(gè)像地址的數(shù)字,猜想可能是調(diào)用這個(gè)函數(shù)后內(nèi)存就被釋放掉了
解決方法一:雙重指針,簡單試了試,好像沒用
解決方法二:用指定了長度的數(shù)組
void getArray(float* result){ //result是個(gè)數(shù)組,長度要在python調(diào)用前指定
	result[0] = 10;
}python調(diào)用
arr_type = ctypes.float * 10
arr_value = arr_type()
dll.getArray(arr_value)
pint([arr_value[i] for i in range(10)])由于獲取數(shù)組前先要獲取到數(shù)組長度,再加一個(gè)函數(shù)
int getArrayLen();其他方法沒試過
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
                分享標(biāo)題:python調(diào)用c++dll庫-創(chuàng)新互聯(lián)
                
                URL鏈接:http://chinadenli.net/article26/gcjcg.html
            
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、品牌網(wǎng)站設(shè)計(jì)、營銷型網(wǎng)站建設(shè)、全網(wǎng)營銷推廣、企業(yè)網(wǎng)站制作、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容