返回信息流已有的动态库
函数原型 void getPoints(unsigned char *pImg,vector<int>&stPoints)
也包括 vksPoint.lib 和vksPoints.dll
头文件 vksPoint.h
二次封装的目的,是把vector用基本数据类型代替
根据已有的和网上相关经验
新的动态库在.h头文件中包含
#pragma comment(lib,"vksPoints,lib")
#include"vksPoint.h"
同时定义了新的函数声明
int VKSPOINT_API getLocation(unsigned char*pImg,int*stPLoc)//int前面应加个static,实际加上后会出现dllexport/dllImport error
在.cpp文件中,函数实现为
int getLocation(unsigned char*pImg,int*stPLoc)
{
vector<int>stPoints;
getPoints(pImg,stPoints);//调用已有的动态库
for(int i = 0;i != stPoints.size();++i)
stPLoc[i] = stPoints[i];//将原动态库得到的数据,转移到新动态库中,便于其它函数调用后使用
return stPoints.size();
}
生成的新动态库为newVksPoints.dll
问题是
这样的封装有问题么
要用这二次封装过的动态库时,新的工程文件中是只包含newVksPoints.dll,还是也要包含原动态库的vksPoints.dll呢
最后 要用c#调用的话,c#中函数原型要怎样写
先谢谢.
这是一条镜像帖。来源:北邮人论坛 / cpp / #93478同步于 2016/9/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
c++动态库的二次封装问题
Ttttl
2016/9/20镜像同步15 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
其实有原本一个就够了,用c#调的时候有vector需要转成基本数据类型,所以才二次封装
这个新封装的库其实没什么作用,要说有的话,就是将原库处理好的数据,原封拷过来,以备新函数调用时使用
【 在 omegacoleman 的大作中提到: 】
: 都要包括,但可以用ilmerge将原dll并入新dll,如果这是你想要的
: csharp不会
【 在 Ttttl 的大作中提到: 】
: 比如呢
g++ -c my_module.cpp -o my_module.o
g++ -fPIC -shared -o libmymodule.so my_module.o -l someexistinglibrary
跨语言调用如果不性能敏感可以用rpc,避免封装的尴尬。。
【 在 Ttttl 的大作中提到: 】
: 其实有原本一个就够了,用c#调的时候有vector需要转成基本数据类型,所以才二次封装
: 这个新封装的库其实没什么作用,要说有的话,就是将原库处理好的数据,原封拷过来,以备新函数调用时使用
。。你说的这个确实是个问题
现在在vs上,所以暂时用windows也能得出动态共享库
刚才新建了c++调用二次封装后的动态库,得到的结果和直接调用动态库(没二次封装)的一样
所以这个二次封装应该没问题(可以这样认为么)而是c#函数声明和调用出现错误了
【 在 nuanyangyang 的大作中提到: 】
:
: g++ -c my_module.cpp -o my_module.o
: g++ -fPIC -shared -o libmymodule.so my_module.o -l someexistinglibrary
【 在 Ttttl 的大作中提到: 】
: 。。你说的这个确实是个问题
: 现在在vs上,所以暂时用windows也能得出动态共享库
: 刚才新建了c++调用二次封装后的动态库,得到的结果和直接调用动态库(没二次封装)的一样
: ...................
那你知道函数加“static”修饰会有什么效果吗?用“extern”呢?用“extern "C"”呢?
对于"static"是为了不在可执行文件中有相同全局变量名时共享库中变量名被忽略?
后两者大概谷歌可找到
所以我的问题 可否给个提示或结论
【 在 nuanyangyang 的大作中提到: 】
:
: 那你知道函数加“static”修饰会有什么效果吗?用“extern”呢?用“extern "C"”呢?