"BUILD_SHARED_LIBS";glfw3.dll, glfw3.pdb, glfw3dll.exp, glfw3dll.lib。System32、SysWOW64 等系统目录。VC++ 目录中的设置(包含目录、库目录)仅影响编译期(编译和链接阶段),不会影响运行时(执行阶段)。
运行时查找 DLL 的路径与编译期的“库目录”无关,必须通过其他方式(如 PATH 环境变量或 DLL 放置位置
参考链接中提到,通过如下链接可以发现显卡被占用,CUDA会抛出一个错误信息,表示没有找到可使用的独立显卡GPU,或者是独立显卡GPU正忙。:
cudaDeviceProp prop;int dev;memset( &prop, 0, sizeof( cudaDeviceProp ) );prop.major = 1;prop.minor = 0;HANDLE_ERROR( cudaChooseDevice( &dev, &prop ) );HANDLE_ERROR( cudaGLSetGLDevice( dev ) );
all CUDA-capable devices are busy or unavailable
但是独立显卡GPU是没有正忙的,是空闲可用的。所以怀疑是调用显卡时出问题,一般有集成显卡,核心显卡和独立显卡,如果系统调用显卡的时候有问题,导致跑CUDA的时候用到了集显或者核显,就会给出错误信息表示找不到可运行CUDA的设备device。
执行以下的代码,系统会列出两块显卡的信息,第一块是英特尔核显,第二块是英伟达独显。
lspci | grep -i vga
然后通过在终端中(命令是"nvidia-settings")打开
Nvidia X Server Settings的界面,
选择PRIME Profiles中的Nvidia(Performance Mode),即设置成独立显卡并重启计算机即可。
CVI(LabWindows/CVI)是 National Instruments(NI) 公司推出的一款 ANSI C 集成开发环境(IDE),专为 测试测量、自动化控制和仪器通信 设计。它结合了 C 语言的高效性和图形化编程的便捷性,广泛应用于工业自动化、数据采集、硬件控制等领域。
CVI 的核心特点
CVI 的典型应用场景
实现全屏最大化以及还原的槽函数on_btnMenu_Max_clicked(),如果不配套使用,比如将showNormal()与setGeometry()混合使用,将会出现无法还原的问题。同理,混合使用showMaximized()和setGeometry()也会出现问题:
void frmMain::on_btnMenu_Max_clicked(){static bool max = false;static QRect location = this->geometry();if (max) {this->setGeometry(location);//showNormal();} else {location = this->geometry();// 全屏方式一:// this->setGeometry(QUIHelper::getScreenRect());//全屏方式二: showMaximized()似乎只能生效一次,第二次就失效了,除非配合上面的showNormal或者下面的hide()就不会有问题// hide();showMaximized();}this->setProperty("canMove", max);max = !max;}
猜测可能是showMaximized()和showNormal()内部设置了同一个标志位变量,所以要配套使用,有待看源码证实!
这说明textEdit的焦点策略是strong policy或者tab policy,改成click policy即可。
Key_Enter是小键盘的确认键,Key_Return是大键盘的回车键。二者缺一不可。
void Widget::keyPressEvent(QKeyEvent *ev){if(
Cell View Identifier(单元视图标识符):定义了一个独立的、完整的设计模块本身。它是“蓝图”或“模板”的ID。Instance Master Identifier(实例母体标识符):定义了一个被引用的、具体的母体对象。它是“根据蓝图制造出来的那个具体零件”的ID。myLib / inverter / schematic,又例如:myLib / inverter / layout这指的是在一个设计中被实例化(引用)的那个目标对象的身份。
当你在一个上层设计(比如 top_level 的版图)中,放置一个子单元(比如 inverter)时,你创建的是一个 “实例”。这个实例本身并不是一个独立的文件,它只是一个指针,指向它所代表的那个底层单元。
这个指针所指向的目标,就是 Instance Master。
它的标识符和 Cell View Identifier 是完全一样的! 也是 Library/Cell/View。
例如:
在你的顶层版图 myLib/top_level/layout 中,你放置了一个反相器。这个反相器实例所指向的 Master 就是 myLib/inverter/layout。
它的作用是:
告诉工具:“我这个实例,是依据哪个蓝
ctrl+alt+s截图后, 可以固定在屏幕上;alt+Actrl+insert或ctrl+shift+C;shift+insert或ctrl+shift+V;vncviewer中去, 需要打开vncconfig才行, 关闭掉vncconfig就不行(难道是bug?), vncconfig路径在/usr/bin下面(可以输入vnc然后tab查看)。vncconfig &, 使其脱离终端后台运行并最小化弹出来的vncconfig设置框, 然后就可以粘贴外部clipboard上的内容了。Always open in browser windows.Create a backup copy of files before savingfind . -name "file.txt"find ./dbcmd -type f -name "*libo.tar.gz" > a.logfind ./dbcmd -type f -name "*libo.tar.gz" | wc -lfind . -type f -name "*ke某个源文件多次包含同一个头文件时,如果头文件中有定义语句,那么不管是什么东西的定义,都可能会产生重定义错误。这种情况是很常见的问题,通常可以使用宏定义保护避免:
#ifndef A_H#define A_H/* 这里写真正的头文件 */#endif
使用#program once也可以,二者区别参考#program once 和 #ifndef。
但是多个源文件包含同一个头文件,宏定义或者#program once也无法进行避免了,一个本人真实遇到的例子是:。
在m_settings.h中:
#ifndef _M_SETTINGS_H#define _M_SETTINGS_H...namespace setting_ns {int aa = 10;QStringList splitArgs(const QString &s, int idx){// splitArgs函数的定义}// 这里因为aa和splitArgs的定义在头文件内,要么改成const和inline,要么将定义放到.cpp中以避免可能的重定义报错}#endif
在qsetting_obj.h中,包含了m_settings.h:
···#include "header/m_settings.h"
很不幸,在main.cpp中,我又同时include包含了qsetting_obj.h和m_settings.h,导致变量aa和splitArgs的multiple definition of重定义报错,哪怕这里套上命名空间都没用,因为是重复包含导致的和自身重复,而不是和外部的别的符号重复。
按道理来说,使用 #ifdef 等条件编译语句避免头文件在同环境被重复包含,由于#ifndef ...宏定义的保护,只会include一次m_settings.h。
但是, 请注意"同环境"这个限定,include虽然只是是简单的将文件复制进cpp吗,当多个cpp源文件包含了同一个头文件时,如果头文件中有某个局部变量或者非内联(inline)函
常见点云存储方式有pcd、ply、txt、bin文件等。kitti数据集的点云是bin格式的,而pcl的数据格式为pcd格式。在使用点云库进行开发时,一般需要将bin格式的点云数据转为pcd格式。网上有很多介绍点云格式如何转换的博客,但是很多的bin2pcd函数的写法都存在小问题,这里记录下我发现的问题并给出解决办法。
首先介绍下比较PCL中常见的PointXYZI点类型。
PointXYZI是一个简单的XYZ坐标加intensity的point类型,理想情况下,这4个变量将新建单独一个结构体,并且满足存储对齐,然而由于PCL的大部分操作会把data[4]元素设置成0或1(用于变换),不能让intensity与XYZ在同一个结构体中。因为如果这样的话其内容将会被覆盖。
例如两个点的点积会把他们的第4个元素设置成0, 否则该点积没有意义,等等。因此,对于兼容存储对齐用3个额外的浮点数来填补intensity,这样在存储方面效率较低但是符合存储对齐要求,运行效率较高。
PointXYZI结构体源代码如下:
// PointXYZI占32个字节,8个浮点数的空间,但是只有四个有效,其余的为填充struct PointXYZI {union {float data[4];struct {float x;float y;float z;}}union {struct {float intensity;}float data_c[4];}}
方法一生成的pcd文件中,可以正常可视化,但是由于最后一个点存在x=0,y=0,z=0,intensity=0的情况,生成深度图时,会出现崩溃问题。
对于使用ascll编码的pcd文件是可以用记事本打开的, 我们打开导致崩溃的pcd文件,可以发现最后一个点是0 0 0 0,这将导致创建深度图时
int a= 4; //a是左值,4 作为普通字面量是右值
1 class A {2 xxx;3 };4 A a;5 auto c = std::move(a); // std::move(a)是将亡值6 auto d = static_cast<A&&>(a); // static_cast<A&&>(a)是将亡值
左值引用就是对左值进行引用的类型,右值引用就是对右值进行引用的类型。都是别名,必须立即初始化。
type &name = exp; // 左值引用type &&name = exp;
反射,即Reflection,是很多高级编程语言的一种十分强大的特性,比如Java,可以于运行时加载、探知、使用编译期间完全未知的classes。而C++是天然不支持反射的,但是可以通过一些特殊手段实现类似反射的效果,本文对使用字符串创建对象,稍作探讨。
我们要实现的目标是要通过字符串创建对象,即下面的代码:
ClassT* obj = FactoryCreate("ClassT");
但是我们要知道,这并不是完全意义上的反射,因为不能取到对象的属性和值,所以只是伪反射。
//// Created by libo on 2022/11/30.//#include <map>#include <string>#include <iostream>#define REGISTER(className) \className* objectCreator##className(){ \return new (className); \} \RegisterAction g_creatorRegister##className( \#className, (constrFuncPtr)objectCreator##c