林宏权
C++资深开发者
展开
-
C++实现取两个经纬度的距离
C++实现取两个经纬度的距离。原创 2024-08-21 17:27:59 · 95 阅读 · 0 评论 -
MAVSDK添加自定义消息与函数实现云台(Gimbal)调整功能
3.运行generate_from_protos.sh重新根据.proto生成.cpp与.h文件。5. .proto生成的.cpp文件,成功实现上面的同步与同步方法。4. .proto生成的.h文件,成功包含同步与异步方法声明。7.重新编译生成libmavsdk_server.so。1.找到action.proto文件并添加如下消息。1.替换原来的action.proto文件。2.通过.proto文件生成java文件。3.重新打包SDK工程,生成JAR包。.proto成功生成.java。原创 2024-08-09 19:02:27 · 120 阅读 · 0 评论 -
mavsdk_server编译iOS平台openssl无法编译通过解决
2.如果报curl库编译不过,设置下面环境变量(先下载并编译安装curl)找到third_party/cares/CMakeLists.txt。原创 2024-07-24 10:32:56 · 90 阅读 · 0 评论 -
MAVSDK动态库与静态库及mavsdk_server程序macOS平台编译与安装
由-DBUILD_SHARED_LIBS=OFF变成-DBUILD_SHARED_LIBS=ON。运行mavsdk_server报库找不到。动态库编译方法与静态库相同,只是参数不同。成功生成libmavsdk.a。makefile 生成成功。中间会编译Openssl。生成makefile。指定路径,再次执行成功。生成makefile。原创 2024-07-13 16:56:58 · 559 阅读 · 0 评论 -
使用UDP通信接收与发送Mavlink2.0协议心跳包完整示例
pymavlink.tools.mavgen表示mavlink目录下的pymavlink/tools/mavgen.py文件。message_definitions/v1.0/common.xml表示生成Mavlink协议的模板文件。--output=generated/include/mavlink/2.0表示输出路径。--lang=C 表示生成支持C语言的Mavlink协议。4.生成Mavlink库,支持在CMAKE中使用。2.进入mavlink目录,安装依赖。3.生成Mavlink的C头文件。原创 2024-07-12 21:49:27 · 347 阅读 · 0 评论 -
MAVSDK示例takeoff_and_land编译与使用
1.克隆MAVSDK源码 ,示例位于源码的examples中。启动程序 ,连接成功,向PX4发指令。3.设置示例工程MAVSDK路径。提供14550给QGC连接。2.安装MAVSDK,下载。提供14540给程序连接。7.启动PX4模拟器。6.添加编译配置参数。原创 2024-07-11 15:17:57 · 219 阅读 · 0 评论 -
libevent源码跨平台编译(windows/macos/linux)
使用管理员身份运行powershell进入build目录执行cmake --install . 进行安装。生成编译配置成功,已支持OpenSSL,MbedTLS,Zlib 这三个库。默认不支持OpenSSL,MbedTLS,ZLIB这三个库。已支持OpenSSL,MbedTLS,ZLIB库。重新生成libevent工程的makefile,重新生成libevent工程的makefile,增加使用Winget安装OpenSSL。编译MbedTLS库时记得加上。开始编译libevent。下载完成会自动运行安装。原创 2024-06-02 02:02:59 · 777 阅读 · 1 评论 -
MbedTLS源码跨平台编译(window/macos/linux)
出现上面原因是克隆下来的library与programs及tests目录少文件了,直接下载zip包替换library目录。安装:(使用管理员身份运行PowerShell)如https无法克隆,使用http。cmake ../生成配置时出错。添加OpenSSL环境变量。替换programs目录。替换library目录。原创 2024-06-02 00:11:38 · 372 阅读 · 0 评论 -
Android调用C++函数
Android调用C++函数原创 2024-05-08 11:58:48 · 352 阅读 · 0 评论 -
ESP8266模块双模式(AP+STA)共存同时与电脑及手机进行UDP通信
运行编译好的udpserver会循环打印接收到的ESP8266模块发送过来的UDP包。6.ESP8266模块向iOS应用发送UDP数据,iOS应用显示接收到的数据包。此时Arduino IDE的串口监视器会一直打印接收到的UDP数据包中的字符串。手机连接ESP8266提供的热点WIFI_ESP8266_AP_STA。电脑上创建一个UDP服务程序,接收ESP8266模块发送的UDP数据包。运行编译好的udpclient会循环向ESP8266模块发包。5.ESP8266模块向电脑发送UDP数据包。原创 2024-01-22 20:03:40 · 621 阅读 · 0 评论 -
C++在类中使用队列Queue
C++在类中使用队列Queue。原创 2024-01-12 16:58:20 · 78 阅读 · 0 评论 -
C++在结构(Struct)中使用队列(Queue)
C++在结构(Struct)中使用队列(Queue)原创 2024-01-11 14:05:10 · 470 阅读 · 0 评论 -
c++实现支持动态扩容的栈(stack)
c++实现支持动态扩容的栈(stack)原创 2024-01-09 22:52:58 · 485 阅读 · 0 评论 -
macosx使用vector实现循环队列
macosx使用vector实现循环队列原创 2024-01-09 17:10:32 · 299 阅读 · 0 评论 -
xcode中使用printf与snprintf格式化输出
5.snprintf不能使用const char * 做为第一个参数。2.使用sprintf格式化字符串。原创 2023-10-21 15:38:54 · 523 阅读 · 0 评论 -
C++通过JNI调用JAVA方法返回ArrayList对象
获取系统已安装应用列表并返回List对象。在JAVA中调用JNI原生方法。原创 2023-08-26 22:26:44 · 1363 阅读 · 0 评论 -
Android基于JNI的Java与C++互调
包名:com_example_getapplist 类名:MainActivity. 函数名:stringFromJNI。函数名格式 Java_包名_类名_函数名(包名.替换为_)原创 2023-08-26 12:45:30 · 848 阅读 · 0 评论 -
编译libtiff库给IOS平台用
克隆成功并打开libtiff目录,发现有autogen.sh 与CMakeLists.txt所以可生成Configure程序来配置并编译,也可直接使用CMake-GUI来配置编译,选择其中一种。接着cmake --build . && cmake --install .然后点击Configure,点击Generate生成makefile。安装成功 : cmake --install .配置出现下面错误,先点击OK,然后再调整配置。编译: cmake --build .提示要创建文件夹,点击Yes。原创 2023-07-15 11:32:09 · 215 阅读 · 0 评论 -
编译libjpeg-turbo库给IOS平台用(包含libjpeg与libturbojpeg)
现在可在IOS平台使用libjpeg.a,libjpeg.dylib,libturbojpeg.a和libturbojpeg.dylib库了。进入libjpeg-turbo目录,发现存在CMakeLists.txt,所以使用CMake-GUI来配置并生成库。使用lipo与otool查看生成库类型与依赖,确认输出类型为arm64。点击congifure生成配置,提示要创建文件夹,点击Yes。生成内容成功输出到libjpeg_out目录。点击Generate生成Makefile。makefile生成成功。原创 2023-07-15 10:12:48 · 271 阅读 · 0 评论 -
编译zlib库给IOS平台用
在弹出的下面对话框中选择Unix Makefiles ,然后点击(Done)完成。使用 lipo与otool查看库类型为arm64,现在可在ios平台使用该库了。zlib自带CMakeLists.txt 所以用CMake-GUI来生成。修改为与系统当前安装的cmake版本 (如:3.22.1)选择zlib源码目录及输出目录,输入下图的CMAKE参数。点击Configure,在弹出的对话框中选择Yes。cmake --install . 进行安装。cmake --build . 进行编译。原创 2023-07-15 00:41:17 · 508 阅读 · 0 评论 -
编译给IOS平台用的liblzma库(xz与lzma)
使用otool -L liblzmadec.a 或者otool -L liblzmadec.dylib 可查看库依赖。执行./autogen.sh生成configure配置程序。查看configure用法 ./configure -h。安装到配置目录`pwd`/Framework/lzma。到这里旧版本的工程已编译OK并可在IOS平台使用了.执行上面脚本开始生成makefile。执行下面指令生成makefile。先进行已下载好的lzma目录。成功生成makefile。原创 2023-07-14 22:04:48 · 850 阅读 · 0 评论 -
android原生工程测试opencv库与opencl功能
1.jni原生工程main文件夹中创建jniLibs。如果找不到C++_Shared添加下面内容。2.复制opencv库到jniLibs。头文件直接复制出来外面,不然识别不了。发现找不到libOpenCL.so。3.复制opencv头文件。编译OpenCL-SDK。增加libOpenCL权限。原创 2023-07-06 22:04:35 · 286 阅读 · 0 评论 -
编译Android平台的OpenCV库并启用OpenCL及Contrib
准备环境与工具: ANDRIOD SDK 与 NDK ,CMAKE ,NINJA ,GCC,G++ ,MAKE。修改ndk-18-api-level-21.config.py,注释掉armeabi-v7a,x86_64,x86。生成过程中输出的SDK,NDK,CMAKE,NINJA,OPENCV版本号,及编译ABI。1.下载好OpenCV与OpenCV_Contirb 版本: 4.7。使用的C与C++编译器及PYTHON位置。编译时使用的参数与已启用的功能。编译平台及目标运行平台。原创 2023-07-05 20:57:28 · 589 阅读 · 0 评论 -
解决QtCreator安卓平台原生C++代码无法输出日志问题
问题: 在QtCreator中只看到qDebug输的日志,并没有看到 cout,cerr,printf的输出日志。1.需求,因原生C++调用std::cout ,std::cerr,及C函数prinf输出要显示在控制台,调用安卓原生C++函数输出日志代替std::cout,std::cerr与printf。在Android Studio 的Logcat中显示了C++原生日志。在QtCreator中显示了C++原生日志。在自己的原生工程中定义日志输出宏。在QtCreator中调用输出。原创 2023-07-02 14:31:02 · 319 阅读 · 0 评论 -
IOS工程使用OpenCV库完整步聚
在下图的Prefix Header 中添加 $(SRCROOT)/PrefixHeader.pch。选择OpenCV源码编译生成输入的IOS平台的opencv2.framework库。成功添加opencv库的引用,现在可在工程中使用opencv库的功能了。2.引用编译好的opencv2.framework框架。添加CoreGraphics.framework库。创建预编译头文件PrefixHeader.pch。opencv库要放在工程目录下,不然会找不到。添加libc++.tbd。mm文件显示 为m+原创 2023-06-23 14:52:45 · 1544 阅读 · 0 评论 -
macOS Sonoma编译OpenCV源码输出IOS平台库
扩展仓: git clone https://github.com/opencv/opencv_contrib.git。主仓: git clone https://github.com/opencv/opencv.git。--iphonesimulator_archs x86_64 : iPhone模拟器。--iphoneos_archs arm64 : iPhone 64位CPU。如果要排除(不编译)某些模块,使用命令 : --without 模块名。确认已安装XCode。确认已安装CMake。原创 2023-06-22 23:42:48 · 1225 阅读 · 0 评论 -
No CMAKE_Swift_COMPILER could be found问题解决
出错定位,原因是启用Swift语言时没有找到CMAKE_Swift_COMPILER变量。修改OpenCV源码路径下的cmakelists.template文件。设置CMAKE_Swift_COMPILER变量。CMAKE官方文档说明启用Swift语言方法。cmake 3.15开始支持swift。编译过程中识别到C++与C编译器。已识别Swfit编译,问题解决。原创 2023-06-22 11:32:53 · 1526 阅读 · 0 评论 -
Linux使用NDK编译libtiff库并移植到Android平台
5.安卓NDK工程集准备NDK19 (19.2.5345600)复制下面内容替换原来的CMakeLists.txt中的内容。1.系统要求: ubuntu 20.04 LTS桌面版本。打开libtiff官方网站 ,打开libtiff源码仓库。编译前要先复制libjpeg库到libtiff目录下。建议使用android stduio安装NDK。保存后输入cmake . 开始生成makefile。修改CMakeLists.txt文件。输入make 回车 开始编译。4.生成编译配置文件。关闭文件与测试程序编译。原创 2023-06-20 21:23:03 · 915 阅读 · 0 评论 -
Qt5.12实战之多线程编程概念
线程执行已执行完成,或者未完成被其他线程发信号取消,或者被非法终止的线程。c. Window NT系统到Win11 属于 多进程,多线程系统(支持多任务同步进行并切换)正在处理器中运行的线程,当前正在使用CPU的线程。b.进程的内存地址空间是独立的, 同一进程内创建的所有线程共享进程的地址空间。创建线程时传入的函数,线程启动后会执行该函数,d.多个线程之间进行切换比多个进程之间进行切换,线程开销更少.a.进程由系统分配与调度,线程由进程创建与销毁,c. 同一进程内的线程切换比进程切换速度更快。原创 2023-04-21 19:12:15 · 652 阅读 · 0 评论 -
Qt5.12实战之规则DLL导出函数使用
在函数的前面添加extern "C" _declspec(dllexport) 来直接导出函数,不用在头文件中声明与def文件中声明。上面通过两种形式来导出两个函数,下面来调用上面所导出的函数。也可按下面形式导出,直接按钮C函数的形式导出,在点击事件中调用MFC DLL的导出函数。选择使用共享MFC DLL的常规DLL。上面是通过Def模块定义文件形导出的。在模块定义文件def文件中声明导出。2.调用MFC DLL 中的导出函数。输入工程名,然后点击创建。输入工程名,然后点击创建。类型,选择基于对话框。原创 2023-04-12 12:31:40 · 674 阅读 · 0 评论 -
保证C++或QT导出库函数名不改变的二种方式
使用 _declspec(dllexport) 导出函数 ,让C++编译器使用C语言方式编译C++源码,并指定调用约定为__cdecl 这样编译后的函数名不会被动.一种是通过修改后缀名为.c 这样C++编译器认为是C项目,会使用C编译器进行编译。另一种是在C++项目的.h文件中使用 extern "C" 来表示单个函数使用C方式编译。使用模块定义文件,并在其中指定导出函数在编译后的DLL中的名称不会被改变.//这里要使用C方式编译的多个方法。如果有多个函数要使用C方式进行编译可使用下面方式。原创 2023-04-07 13:45:08 · 847 阅读 · 0 评论 -
函数调用与函数名修饰约定
指编译器使用何种名字修饰来区分不同的函数,编译器在编译期间会为函数创建一个具有一定规则的修饰名,这叫名称修饰.C编译器与C++编译器的名称修饰不同.函数名@类名[@@QAE/@@IAE/@@AAE]返回类型代码 参数1代码 参数2代码 ...@Z。第一个H表示函数的返回类型,H表示为int类型,第二个H表示函数的参数 类型。0CMath@@QAE@H@Z @H表示返回值为int的构造函数。表示修饰名开始,f是函数名, @@YA表示是__cdecl调用约定 ,原创 2023-04-06 23:40:09 · 260 阅读 · 0 评论 -
Qt基于ffmpeg实现视频快速分割
使用方法: video_split 要分割的视频名 视频总大小(时长*60) 分割视频块大小(时长*60)11.46 * 60 = 687.6 (秒) 2.5 * 60 = 150 (秒)原创 2023-03-21 20:30:53 · 315 阅读 · 0 评论 -
linux网络通信之UDP数据包伪造
linux网络通信之UDP数据包伪造。原创 2023-03-12 00:43:22 · 135 阅读 · 0 评论 -
linux系统网卡工作模式及数据报文接收
如设置网卡工作模式为多播模式,那么非组内(组外)成员也可接收所有多播帧。广播模式(Broadcast): MAC地址为0xffffff的帧为广播帧,广播模式下的网卡只能接收广播帧。多播模式(Multicast): 多播地址作为目标MAC帧,可被组内所有设备同时接收.组外设备无法接收.混杂模式一般用于网络数据监听,用于捕获非广播,非多播,非直接模式下的报文。混杂模式(Promiscuous): 接收所有通过网卡的帧。注: 网卡在不同的工作模式下接收的数据报文不同.网卡的默认工作模式: 广播 + 直接。原创 2023-03-10 02:04:18 · 700 阅读 · 0 评论 -
linux网络编程之网际层原始套接字解析
第三个参数 : 运输层传入: ETH_P_IP ,ETH_P_ARP,ETH_P_RARP,ETH_P_ALL其中一个。网际层传入: IPPROTO_TCP,IPPROTO_UDP,IPPROTO_ICMP,IPPROTO_IGMP,第二个参数 : 运输层可传入 SOCK_RAW与SOCK_DGRAM ,网际层传入SOCK_RAW。TCP和UDP属于运输层(也叫传输层),IP属于网际层(也叫网络层)UDP校验和(16bit)目标端口号(16bit)源端口号(16bit)源端口号(16bit)原创 2023-03-10 01:29:59 · 395 阅读 · 0 评论 -
原始套接字(Raw Socket)
运输层下IP数据不关注内核是否已有注册的句柄来处理这些数据,都会将这些IP数据复制一份传递给与协议类型匹配的原始套接字,没有的话,直接丢弃该数据,并返回主机不可达。应用层(HTTP,FTP,TFTP...) ->运输层(TCP,UDP)->网络层(IP,ICMP,IGMP)->网络接口层(ARP,RARP)创建原始套接字,socket(PF_PACKET,SOCK_RAW,ETH_P_IP),数据收发是从MAC首部。超过 42的是IP数据报: 6+6+2 + 46+4 =64。一般用于自定义协议的实现,原创 2023-03-08 18:10:12 · 316 阅读 · 0 评论 -
linux多对一网络组播使用
linux多对一网络组播使用。原创 2023-03-07 22:54:12 · 114 阅读 · 0 评论 -
linux网络广播使用
服务端: 创建UDP socket --> 初始化广播地址 -->setsockopt设置网络广播-->sendto广播数据。客户端: 创建UDP socket --> bind绑定网络地址 -->recvfrom接收广播数据-->关闭网络。UDP服务器在广播数据时,数据报使用的地址不是UDP服务器地址,而是广播地址。UDP广播服务端与接收UDP广播数据的客户端必须端口相同,不然接收不到广播数据。UDP服务器广播数据时使用地址是:192.168.1.255。4.发送udp广播数据。原创 2023-03-07 19:19:48 · 1073 阅读 · 0 评论 -
TFTP协议报文解析
TFTP操作码: 1:RRQ 2:WRQ 3:DATA 4:ACK 5:ERROR。TFTP报文: 2字节 x字节 1字节 x字节 1字节。TFTP数据报文: 操作码 + 文件名 + 0 + 模式 + 0。TFTP模式: octet netascii。UDP报文: UDP首部 + TFTP数据报文。IP数据报文: IP首部 + UDP报文。注: 上面表中的0 表示 '\0'结尾字符。数据(0~512字节)原创 2023-03-06 11:33:38 · 521 阅读 · 0 评论