Jump to Navigation

C++

C/C++编程

由windows上链接现象不同引出的golang CGO跨平台用法总结

由windows上链接现象不同引出的golang CGO跨平台用法总结

在开发一个项目时,碰到一种用法,是在C++中调用go编写的静态库,而在go中又需要回调C++函数。

1、第一种解决办法,简单方式(后来证明windows上不支持)

这种方式,就是在C++中实现了这个函数之后,在go中extern一下这个函数,

在go源代码中就可以直接调用这个函数了。

注:当然这里的函数签名要用extern "C"声明的,否则在go中无法调用到。

这种有一个问题,不能用在windows上,windows上在链接静态库时,必须要所有的符号都存在,

而前面提到的是extern方式,实际符号并不存,导致编译失败。

2、第二种办法,通用方法,但比较繁索一点。好像这是唯一可行的跨平台的通用方式了。

在go代码中声明一个函数指针,和一个设置该函数指针值的函数,和一个调用该函数指针的函数,例如,

Category:

msvc2017编译Qt5.7.1(支持Windows XP) (mingw-x64 gcc-6.3/7.1 qt5.7.1)

msvc2017编译Qt5.7.1(支持Windows XP) (mingw-x64 gcc-6.3/7.1 qt5.7.1)

最近做了点Qt + Windows程序,对最近的Qt情况的一点总结。

Qt也不准备继续支持Windows XP了,Qt5.7.0是官方公开支持的最后一个版本,包括Qt5.7.1都不行。

这里我标题说的没错,本文指的确实是Qt5.7.1,由于同为Qt5.7.x系统,源代码树变动不大,做了个小的调整,能够像Qt5.7.0一样支持Windows XP。

新版本兼容Windows XP宏定义

从vs2012 update4开始,发布了支持Windows XP的解决方案,

vs安装包的名字为:对 C++ 的 Windows XP 支持

msvc2017, USING_V141_SDK71

msvc2015, USING_V140_SDK71,

msvc2013, USING_V120_SDK71,

msvc2012, USING_V110_SDK71,

两个socket相关问题

检测socket关闭

#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <time.h>

int isclosed(int sock) {
  fd_set rfd;
  FD_ZERO(&rfd);
  FD_SET(sock, &rfd);
  struct timeval tv = { 0 };
  select(sock+1, &rfd, 0, 0, &tv);
  if (!FD_ISSET(sock, &rfd))
    return 0;
  int n = 0;
  ioctl(sock, FIONREAD, &n);
  return n == 0;
}

close a running process's socket

sudo gdb -p 10029 --batch -ex 'call close(4)'

golang CGO FAQ & TIPS : cgo 从 C 传递 slice 到 go

cgo 从 C 传递 slice 到 go

这里一般会用在c的callback中。

需要加一个wrapper,比直接调用go函数中间多了一个转换步骤,但方便了许多。

执行流程为,c调用发起 -> c wrapper -> go export

.go:

//export a_function_callback
 func a_function_callback(args []C.astruct) {}

.c:

qt.rust绑定中的signal/slot实现

qt.rust绑定中的signal/slot实现

中继层次

中继实例的回收,可以使用QObject parent方式回收,或者,手动管理回收。

有没有可能使用QSignalMapper来管理呢

回调层次

signal连接层次

C++11信号连接

传统Qt信号连接

信号连接到一个函数或者闭包,或者另一实例的slot。

连接到另一个实例的语法难以实现,要写成闭包,而闭包则无法释放空间的问题。因为rust无法表达方法变量。

关闭信号连接

Qt支持关闭某个实例的所有连接,支持关闭某个实例的某个信号的所有连接。

支持关闭某个实例连接到另一实例slot的连接。

控制粒度还是非常细的,功能非常完整的。

可能QObject的findChildren有用,遍历object的层次关系。

Category:

rust实现继承

rust实现继承

目前找到两种方式 ,一种使用AsRef trait,一种使用Deref trait,都能实现单继承,而AsRef则能实现类似多继承的功能。

第一种,显式的.as_ref()

AsRef这是rust提供的一个trait,用来做类型的转换,例如,

impl AsRef for NButton { fn as_ref(&self) -> &NWidget { return &self.nbase; } }

其含义为,为NButton类型实现AsRef trait,可以把NButton类型引用转换为NWidget引用。

前提是NButton引用能在某处存放着一个nbase,如self.nbase。

有了这个trait实现之后,可以简单的方式实现类型转换了,

 btn.as_ref().callsth();

这个在使用上稍微有点不方便,需要显式地调用as_ref()方法。

多继承:

一种PHP实现grpc协议调用grpc服务的方案

一种PHP实现grpc协议调用grpc服务的方案

原由

在前面的文章中,曾经提到grpc对PHP语言的支持情况。

主要是因为php-grpc的支持实现不完善,有明显的bug,支持落后于其他主要的开发语言。

从这个方向上考虑,如果要解决的话,需要完善php-grpc扩展,修复bug等,工作量可能比较大。

这段时间考虑到了一种临时替代方案,以解决在PHP中实现grpc协议调用服务的需求。

把使用go语言实现的客户端转换为PHP能调用的动态库

grpc对go语言的支持还是非常完善的,如果能够利用go的实现来支持PHP就好了。

刚开始只是考虑了一下,经过一些查找测试,发现这种方式真的是可行的,实际上已经有人实践过了。

最主要的是,这种方式还是go官方提供的,非常支持的方式,因为go语言有志于替代使用C/C++这类语言开发动态共享链接库。

这个实现方案的机制描述如下,

cargo的依赖处理

cargo的依赖处理,

三种依赖配置方式:

[dependencies]
depend-pkg-name="pkg-version or *"
depend-pkg-name={git = "git repo", rev = "bfabc843ef2"}
depend-pkg-name={path = "./helloutils"}   #支持绝对路径,相对路径。

一些释疑

在编译时,cargo首先从https://github.com/rust-lang/crates.io-index下载官方所有crate的索引列表。

crate索引crates.io-index大小达到31M,估计以后还会变得更大。

下载依赖包的过程是递归的。

索引列表放在什么位置呢?~/.cargo。

如何指定本地某一目录下的crate呢?$CARGO_HOME,设置该变量后,~/.cargo位置被覆盖了。

本地搜索一个crate的机制,从该项目目录开始,逐级向上查找带.cargo目录的位置。

上否支持多个$CARGO_HOME路径呢?

toxcore几个常量记录

toxcore几个常量记录:

创建toxcore初始节点与快速测试

使用正式的toxcore网络,目前速度上还有些慢,包括连接到网络上,以及添加好友等操作。
可能是因为toxcore的节点还不是那么多,DHT程序上也优化的不够吧。

可以使用一种简单的方式,实现一个快速的toxcore网络,
用这个小网络做测试,然后再加入到正式的toxcore网络测试。

建立一个自己的toxcore网络,
首先要启动一个初始节点,在toxcore源码树中other/bootstrap_daemon/目录中,
编译出tox-bootstrapd程序,配置该目录中的示例配置文件,启动命令,
tox-bootstrapd tox-bootstrapd.conf

注意,如果要把这个节点作为一个新的toxcore网络的初始节点,
需要把bootstrap_nodes=()一段置空,或者删掉这一段。

頁面

訂閱 RSS - C++


Main menu 2

by Dr. Radut