1. error: ‘for’ loop initial declarations are only allowed in C99 mode
这是因为gcc基于c89标准,换成C99标准就可以在for循环内定义i变量了:
gcc src.c -std=c99 -o src
2. cpp引用.c文件 ,需要给.c文件编写个头文件才可以
3. relocation R_X86_64_PC32 against undefined symbol `DecodeSimpleBitmap(decoder_t*, unsigned char const*, int)' can not be used when making a shared object; recompile with -fPIC
去掉 头文件和c文件 函数前面的static即可
4.
查看动态库中的函数
nm -D libsubtitle_service.so
查看静态库/动态库中的函数
linux
nm -g --defined-only xx.a
nm -D xx.so
windows
dumpbin /exports libxxx.a
查看.a文件中的.o
ar -v -t ./libtensorflow-core.a
nm 命令详解 http://www.360doc.com/content/13/0526/17/532901_288335598.shtml
https://baike.baidu.com/item/nm/4592092?fr=aladdin
5. 编译程序遇到问题 relocation R_X86_64_32 against `.rodata' can not be used when making a shared object;
发现编译的程序引用的一个库(.a文件)是直接用./configure 编译的, 64位机器不能直接./configure 进行配置,需要采用如下方式
CFLAGS="-O3 -fPIC" ./configure
make
make install
6. libopencv_core.a(persistence.cpp.o): In function `icvGets(CvFileStorage*, char*, int)':
静态库少东西,加上-lz -ldl 即可
7. 包含静态库的时候,顶层lib先链接,底层lib后链接
8. 出现undefined sample 的一个原因 , make clean 未完全清楚之前的.o文件,修改makefile即可
9. char*指针malloc后,不要给其赋指针,要用strcpy的方法拷贝数据。 不然会出现内存泄露,free该指针出现崩溃
10 。pthread_mutex_t 一定要初始化和释放,不然出了问题都不知道是哪里出了我勒个去。。。。pthread_mutex_init
11. 头文件:
stdlib.h: malloc
12 常见数据结构字节数
WIN32
unsigned short : 2
long : 4
unsigned long : 4
unsigned char : 1
char : 1
unsigned int : 4
short : 2
LINUX_64
unsigned short : 2
long : 8
unsigned long : 8
unsigned char : 1
char : 1
unsigned int : 4
short : 2
13 GDB调试命令
1. 添加断点
某行添加断点 b 2
某函数添加断点 b functionName
2. 单步调试 s
3 . 运行 r
4. 查看变量值
查看局部变量 info locals
打印数组值 p a
5. 指定文件断点 b filepath:line_number
6. 删除所有断点 clear
删除第几个断点 delete 1
7 继续运行 c
14. Makfile
生成可执行文件 g++ mutiprocess.cpp -o test
链接生成静态库 ar crv libmyAPI.a myAPI.o
-fpic:产生位置无关码,位置无关码就是可以在进程的任意内存位置执行的目标码,动态链接库必须使用
-c : 只生成 .o 文件
-o : 生成可执行文件
-g : 生成可调试文件
-lworld 表示libworld.so动态库文件
-L 指定库目录
“-static”表示寻找libworld.a静态库文件
-shared 生成动态库
-s : 在命令运行时不输出命令的输出
.so makefile
-Wl 选项告诉编译器将后面的参数传递给链接器。
-soname 则指定了动态库的soname(简单共享名,Short for shared object name)
-rpath <dir> 将一个目录强行指定为.so的搜索目录
include foo.make *.mk $(bar) 包含文件
-Wl,-rpath,/usr/local/lib 指定运行时库目录
15 类、模板
1. 带参数构造函数初始化
2, 模板函数的特化
16 VS 相关
16.1 目录
$(TargetName) :项目名
$(TargetExt):生成目标后缀,比如".exe"
$(Platform) Win32 或 X64
$(SolutionDir)
$(Configuration) Debug 或 Release
$(ProjectName)_d 目标文件名填这个,则生成的xxx_d.lib xxx_d.dll
16.2 VS win32程序升级为X64
---->然后点开全部设置为X64
然后点击项目-->属性-->链接器-->高级-->目标主机 改为X64
16.3 禁用大括号自动补全
选项--文本编辑器--C/C++ -- 常规-- 自动大括号完成
16.4 VS 插件 indent guides : 给代码加虚线
16.5 dll 路径加入环境变量 然后重启VS就行了
16.6 注释与解注释快捷键
注释 ctrl + K + C 解注释 ctrl+K +U
16.7 无法加断点
选项--调试---启用 “使用托管兼容模式” + "使用本机兼容模式" 成功!!!
16.8 Debug模式无法查看局部变量的值
项目--属性--C/C++ -- 优化 -- 禁用/od
项目-〉属性-〉配置属性-〉链接器-〉调试-〉优化以便于调试。
16.10 debug 的exe 或者dll 后面跟“_d”
常规 -- 目标文件名 --$(ProjectName)_d
18 ldd 可以发现so依赖的动态库
ldd libpic_detection_service.so
19 不要给int []数组 用memset赋值 , memset 只能给uchar char 赋值 。。 memset 对于int 只能用来清零。
20 regex C++11 匹配 需要加 -std=c++11
vector<string> search_string(const string& in, const string &pattern_t)
{
const regex pattern(pattern_t);
std::sregex_token_iterator p(in.begin(), in.end(), pattern);
std::sregex_token_iterator end;
std::vector<std::string> vec;
while (p != end)
vec.push_back(*p++);
return vec;
}
21 C语言中求 sin cos asin 都是弧度制
22. C++ 中的 extern static const
23. extern "C" 用法
第一是两个函数放到同一个cu文件中。
第二是在cu文件属性页面选项卡中 cuda c/c++->common->Generate Relocatable Device Code 选择-rdc=true。允许重定位device代码编译。或者在整个工程的cuda c/c++项中配置这个-rdc=true.
25 static
静态函数只能是本源文件内可见,其他源文件可以定义同名函数
不加static的函数,可以被其他源文件中的函数进行调用 ,若定义同名函数会报错(或出现函数重载)
26 SSE 指令集
addps:对128位寄存器的每32位做浮点加法运算。
subps:对128位寄存器的没32位做浮点减法运算。
mulps:对128位寄存器的每32位做浮点乘法运算,并且不考虑乘法可能形成的进位。
divps:对128位寄存器的每32位做浮点除法运算。
paddd:对128位寄存器的每32位做整形加法运算。不过我在做YUV与RGB互转的指令优化中用到更多的是paddw,该指令是对128位寄存器的每16位做加法运算,在保证不出现进位的情况下,paddw指令比paddd一次能处理更多字节的数据。
psubd:对128位寄存器的每32位做整形减法运算。当然也有psubw可以处理16位整形减法。
pmulld:对128位寄存器的每32位做整形乘法运算,形成一个64位的立即数,然后取立即数的低32位到目的寄存器的对应bit位中。诸如此类的pmullw,是对128位寄存器的每16位做整形乘法运算,形成一个32位立即数,然后取立即数的低16位到目的寄存器的对应bit位中。
float af[4] = {5.0f, 6.0f, 7.0f, 8.0f}; float bf[4] = {5.0f, 6.0f, 7.0f, 8.0f}; float add[4], sub[4], mul[4], div[4]; __asm { movups xmm0, af; movups xmm1, bf; movups xmm2, xmm0; // 加法 addps xmm0, xmm1; movups add, xmm0; // 减法 movups xmm0, xmm2; subps xmm0, xmm1; movups sub, xmm0; // 乘法 movups xmm0, xmm2; mulps xmm0, xmm1; movups mul, xmm0; // 除法 movups xmm0, xmm2; divps xmm0, xmm1; movups div, xmm0; } // 上面用到的四则运算指令都是浮点运算指令 int ai[4] = {4, 5, 6, 7}; int bi[4] = {4,5, 6, 7}; int add[4], sub[4], mul[4], div[4]; __asm { movupd xmm0, ai; movupd xmm1, bi; movupd xmm2, xmm0; // 加法 paddd xmm0, xmm1; movupd add, xmm0; // 减法 movupd xmm0, xmm2; psubd xmm0, xmm1; movupd sub, xmm0; // 乘法 movupd xmm0, xmm2; pmulld xmm0, xmm1; movupd mul, xmm0; // 除法 movupd xmm0, xmm2; divps xmm0, xmm1; movupd div, xmm0; }
27 使用OPENCV静态库, 运行程序时出现错误 undefined symbol: _ZN2cv12_OutputArrayC1ERNS_3MatE
1 交换库的包含顺序 -----仍然出现
2 加入Xlinker 仍然出现
3. 加入 rm -f $(FILE)/picture/cv_picture.o 成功, 发现是因为旧的.o 文件没有清除的原因,麻蛋。
28 opencv 需要包含的库
opencv244 : opencv_core244d.lib opencv_highgui244d.lib opencv_imgproc244d.lib
29 Win32
29.1
Win32控制台程序中使用CString
<afxwin.h> #include<afx.h> 在<windows.h> 之前包含
29.2 解决 nafxcw.lib 和 libcmt.lib 库冲突问题 附加依赖项里输入nafxcw.lib 即可
29.3 一个最简单的win32 程序 https://zhidao.baidu.com/question/589941830.html
30 . new 一个int 数组失败,报堆损坏的错误-------代码其它地方有内存泄露!!!
32 无法解析的外部符号
32.1 .
问题:无法解析的外部符号__imp__wassert 默认库“msvcrtd.lib”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
解决方法 :工程中有库用了MD编译,重新用MT编译就行了
法2 : (不建议用,用了后程序性能下降)右击工程 - 属性 ”配置属性 - 链接器 - 命令行” 添加: /NODEFAULTLIB:"libcmt.lib"
33. VS只生成dll 不生成 lib : 预定义里加上 SOUI_EXPORTS ,
如果仍然未解决 查看.cpp 是否点击了“不参与生成”
34 makefile 中 := https://blog.csdn.net/fdsafwagdagadg6576/article/details/46680927
36 解决dll 链接不一致
VS宏定义加入 AOS_EXPORTS 即dll的生成宏就行了
37 0X150002 解决办法
计算机-管理-windows日志-查看错误原因- 发现libcurl 加载失败
然后使用阿里云里面的curl.dll 就好了。
38 core文件分析
1. core文件生成打开方式:
ulimit -c unlimited
echo "1" > /proc/sys/kernel/core_uses_pid
看下服务器上是否安装了 gdb,没有的话要装一下
以调试模式打开程序 ./sip_gw -t2 -n 1
之后程序会crashed, 程序目录或者根目录 会生成一个core文件
2. core 文件分析
查看core文件 :
gdb transcoder core.64488 然后输入bt
3. 关闭 core ulimit -c 0
ulimit -c 0 不产生core文件
ulimit -c 100 设置core文件最大为100k
ulimit -c unlimited 不限制core文件大小
39 函数指针做形参
40 迭代器用法
for (std::vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter) *iter = 0;
41 sizeof
class A{ char a; double b; int c; }; //a、b、c的长度分别为1、8、4,以最长的8为界分为三组:a为一组,取8大于1的最小倍数,为8。 //第二部分只有b,大小为8B。第三部分只有c,取8大于4的最小倍数,即为8。sizeof(A)=8+8+8=24B。 class B{ char a; int b; double c; }; //a、b、c的长度分别为1、4、8,以最长的8为界分为两组,a、b为一组,和为5,取8大于5的最小倍数,为8。 //第二部分只有c,所以sizeof(B)=8+8=16B。
42 VS远程调试linux程序
https://blog.csdn.net/endurehero/article/details/81206398
https://blog.csdn.net/yitang2003/article/details/77196721
可能遇到的问题:undefined symbol 解决方法
43 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 LNK2019 无法解析的外部符号 "public: void __thiscall XX
在vs2010项目设置中【Linker】-【input】-【additional dependencies】追击nafxcw.lib,libcmt.lib,Debug下,追加Nafxcwd.lib,libcmtd.lib。
44
windows 判断是否是64位程序 _WIN64
linux
46 使用 opencv 库出现bug undefined reference to `Imf_2_2::globalThreadCount()'
原因: IlmImf库是C++0x编译的, 但是你的程序使用的参数是std=c++11
解决方法 参数设置为std=c++0x
48 静态库和动态库链接
static lib -L path -llib -static
dynanic lib : -L path -llib
49 复制构造函数 和 赋值函数的区别
https://www.cnblogs.com/kaituorensheng/p/3245522.html
50 uint64 在数据中的存储结构
51 xml 的读取与生成
读取: https://blog.csdn.net/qingzai_/article/details/44982725
生成: https://blog.csdn.net/u012104827/article/details/81109000
52 Makefile 加入其它Makefile
include Vector3D/makefile
include Color/makefile
53 CMAKE
Cmakelist 详解 https://www.cnblogs.com/cv-pr/p/6206921.html
cmake 参数 BUILD_SHARED_LIBS:指定编译成静态库还是动态库;
https://blog.csdn.net/fengbingchun/article/details/46685413
CMAKE 设置安装目录
CMAKE_INSTALL_PREFIX
1. add_library
该指令的主要作用就是将指定的源文件生成链接文件,然后添加到工程中去。该指令常用的语法如下:
add_library(${EXECUTABLE_NAME} SHARED ${SOURCE_FILES})
2. link_directories
该指令的作用主要是指定要链接的库文件的路径,target_link_libraries(${EXECUTABLE_NAME} ${OpenCV_LIBS})
3. target_link_libraries
该指令的作用为将目标文件与库文件进行链接。
安装opencv静态库
wget https://github.com/opencv/opencv/archive/3.4.0.tar.gz
cmake ../ -DCMAKE_INSTALL_PREFIX=install -DBUILD_SHARED_LIBS=false -DBUILD_PERF_TESTS=false -DBUILD_TESTS=false
###-DWITH_OPENEXR=OFF
一些错误解决办法:
opencv-3.3.0/modules/videoio/src/cap_ffmpeg_impl.hpp
文件最开始加入以下三行
#define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22) #define CODEC_FLAG_GLOBAL_HEADER AV_CODEC_FLAG_GLOBAL_HEADER #define AVFMT_RAWPICTURE 0x0020
55 pkgconfig
gcc -g arrow.c -o arrow `pkg-config "gtk+-2.0 > 2.0.0" --cflags --libs`
g++ 'pkg-config --cflags --libs "/work/lib/opencv/3.3.0" '
56 链接opencv库出现错误 undefined reference to symbol 'pthread_mutexattr_settype@@GLIBC_2.2.5'
说明opencv库是用2.2.5的Glib编译的, 我们需要使用更低内核的opencv库
解决方法是使用更低版本glibc编译的opencv
57 ubuntu14安装 G++-5
sudo apt-get install g++-5
58 添加库路径
/etc/ld.so.conf
/sbin/ldconfig
58 vs2019 编译linux C++
https://blog.csdn.net/ZYZMZM_/article/details/89044885
59 vector 排序
#include<iostream> #include<vector> #include<set> #include<string> #include<algorithm> using namespace std; struct student{ char name[10]; int score; }; //自定义“小于” bool comp(const student &a, const student &b){ return a.score < b.score; } int main(){ vector<student> vectorStudents; int n = 5; while (n--){ student oneStudent; string name; int score; cin >> name >> score; strcpy(oneStudent.name, name.c_str()); oneStudent.score = score; vectorStudents.push_back(oneStudent); } cout << "===========排序前================" << endl; for (vector<student>::iterator it = vectorStudents.begin(); it != vectorStudents.end(); it++){ cout << "name: " << it->name << " score: " << it->score << endl; } sort(vectorStudents.begin(),vectorStudents.end(),comp); cout << "===========排序后================" << endl; for (vector<student>::iterator it = vectorStudents.begin(); it != vectorStudents.end(); it++){ cout << "name: " << it->name << " score: " << it->score << endl; } return 0; }
60 libyuv
libyuv::RGB24ToI420(src.data, 3 * src.cols, yuv.data[0], yuv.stride[0], yuv.data[1], yuv.stride[1], yuv.data[2], yuv.stride[2], w, h);
61 map
#include <map> #include <iostream> #include <vector> #include<algorithm>//因为用了sort()函数 #include<functional>//因为用了greater<int>() using namespace std; typedef map<int, double>::iterator Miter; int main() { vector<double > ds; ds.resize(4); ds[0] = 1; ds[1] = 0.2; ds[2] = 5; ds[3] = 3; map<int, double,greater<int>> ens; for (int i = 0; i != ds.size(); ++i) { ens.insert(map<int, double> ::value_type(i*(-1), ds[i])); } ////查找key为0 的元素 Miter _it = ens.find(-1); cout << _it->first << " " << _it->second << endl;//遍历map int i = 0; for (map<int, double>::iterator it = ens.begin(); it!= ens.end(); ++it) { cout << it->first << " " << it->second << endl; } system("pause"); //cin << endl; }
62 libyuv 使用
注意: libyuv 里面的RGB 都是指的BGR ARGB 指的是 BGRA
#ifdef ENABLE_LIBYUV if (bpp == 32) { libyuv::ARGBToI420(src[0], src_stride[0], dst[0], dst_stride[0], dst[1], dst_stride[1], dst[2], dst_stride[2], width, height); } else { libyuv::RGB24ToI420(src[0], src_stride[0], dst[0], dst_stride[0], dst[1], dst_stride[1], dst[2], dst_stride[2], width, height); } return 0; #else
63 内存泄露
apt-get install valgrind
valgrind --leak-check=full --show-reachable=yes --trace-children=yes ./test
#include<stdio.h> #include<string.h> #include<stdlib.h> int main(void) { char *ptr = (char*)malloc(10); memset(ptr, 0, 10); strncpy(ptr, "Linux", strlen("Linux")); printf(" ptr = [%s] ", ptr); ptr[0] = 'a'; printf(" ptr = [%s] ", ptr); return 0; }
$ valgrind --leak-check=yes ./memcheck ==3632== Memcheck, a memory error detector ==3632== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al. ==3632== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info ==3632== Command: ./memcheck ==3632== ptr = [Linux] ptr = [ainux] ==3632== ==3632== HEAP SUMMARY: ==3632== in use at exit: 10 bytes in 1 blocks ==3632== total heap usage: 1 allocs, 0 frees, 10 bytes allocated ==3632== ==3632== 10 bytes in 1 blocks are definitely lost in loss record 1 of 1 ==3632== at 0x402BE68: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) ==3632== by 0x8048428: main (memcheck.c:7) ==3632== ==3632== LEAK SUMMARY: ==3632== definitely lost: 10 bytes in 1 blocks ==3632== indirectly lost: 0 bytes in 0 blocks ==3632== possibly lost: 0 bytes in 0 blocks ==3632== still reachable: 0 bytes in 0 blocks ==3632== suppressed: 0 bytes in 0 blocks ==3632== ==3632== For counts of detected and suppressed errors, rerun with: -v ==3632== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
查看程序是否有内存泄露:
Mem 一直增加
vmstat 1 swp 一直增加
清除 swpd
swapoff -a
swapon -a
64 auto 遍历map
for( auto &shader : shaders){
SAFE_DELETE(shader.second);
}
65 lamba 函数 匿名函数
auto get_bin = [number_of_bins, &original_image](int x, int y) { const Vector3d pixel_color = original_image.get_rgb(x, y); const int bin_r = std::min(static_cast<int>(std::floor(pixel_color(0) * number_of_bins)), number_of_bins - 1); const int bin_g = std::min(static_cast<int>(std::floor(pixel_color(1) * number_of_bins)), number_of_bins - 1); const int bin_b = std::min(static_cast<int>(std::floor(pixel_color(2) * number_of_bins)), number_of_bins - 1); return Vector3i(bin_r, bin_g, bin_b); };
66 多线程
template<typename Callable> void perform_in_parallel(Callable function, int width, int height) { const int hint = std::thread::hardware_concurrency(); const int n_threads = std::min(width * height, (hint == 0) ? 4 : hint); auto inner_loop = [width, height, n_threads, function](const int j) { const int n = width * height; const int start_index = j * (n / n_threads); const int end_index = (j + 1 == n_threads) ? n : (j + 1) * (n / n_threads); for (int k = start_index; k < end_index; ++ k) function(k % width, k / width); }; std::vector<std::thread> threads; for (int j = 0; j < n_threads; ++ j) threads.push_back(std::thread(inner_loop, j)); for (auto& t : threads) t.join(); }
67 vector 转 char*
vector<char> a;
char* b = &a[0];
68. 全局变量的声明和定义 在头文件中使用 ,声明使用extern 标识符
声明: extern ColorUnmixing cu; (必须在头文件中)
定义: (必须在main.cpp 中,只能定义一次, 如果没有extern 修饰符,则表示定义该变量)
#include "unmixing/unmixing.h" ColorUnmixing cu;//定义
69 thread 使用
bool HelloWorld::init() { if ( !Layer::init() ) { return false; } std::thread t1(&HelloWorld::myThread,this);//创建一个分支线程,回调到myThread函数里 t1.join(); // t1.detach(); CCLOG("in major thread");//在主线程 return true; } void HelloWorld::myThread() { CCLOG("in my thread"); }
70 openmp 使用
#include<omp.h>
#pragma omp parallel num_threads(4) //表示使用4个线程 用起来比thread 快
{
int index = omp_get_thread_num();
childFunc(child_pics[index], child_pics_d[index]);
}//7.3 ms cpu=60%
71 DLL 的动态加载
#include <dlfcn.h> int openDll(const char * so_path, render_contxt & rc) { char *error; void *handle = dlopen("../libemboss.so", RTLD_LAZY); if (!handle) { fprintf(stderr, "%s ", dlerror()); exit(1); } dlerror(); /* Clear any existing error */ rc.init = (__render_libinit)dlsym(handle, "libinit"); rc.oper = (__render_liboper)dlsym(handle, "liboper"); rc.stop = (__render_libstop)dlsym(handle, "libstop"); //dlclose(handle); return 0; }
72 linux 编译动态库和静态库 Makefile
https://blog.csdn.net/shaoxiaohu1/article/details/46943417
73
编译时使用 public ref class ABC { ... };
调用时 右键---引用 --- 添加dll引用 即可
74
A 依赖于 B.a
A B.a 同时依赖于 opencv.so
编译B.a : ar 链接
编译A :-lopencv_world 即可
75 sizeof
https://blog.csdn.net/sssssuuuuu666/article/details/80130632
76 hash
unordered_map
77 设计模式 原理及源代码
https://www.cnblogs.com/chengjundu/p/8473564.html
78 FFmpeg 已否决
不用再取消SDL检查,不用再添加#pragma warning(disable :4996),下面才是正确的解决方法!!
79 C++ 11 实现信号量
void second(function<void()> printSecond) { std::unique_lock<std::mutex> lk(g_mutex); cv1.wait(lk, [this]() {return counter == 2; }); // 阻塞当前线程,直到条件变量被唤醒 // printSecond() outputs "second". Do not change or remove this line. printSecond(); counter++; cv2.notify_one(); }
std::condition_variable cv1;
std::condition_variable cv2;
// 使用lock和unlock手动加锁
std::mutex g_mutex;
80 获取数组中第K大的值
#include<algorithm>
nth_element(tmp.begin(), tmp.begin()+m_index, tmp.end());
81 宏使用大全
https://blog.csdn.net/Bluechalk/article/details/82490863
82 ippcc 库使用大全
http://blog.sina.com.cn/s/blog_635ff3050102wsyz.html
83
vector 预分配内存 reserve vector::size 仍为0!!
vector 分配元素个数 resize
84
数字转string to_string(int)
85 虚函数表
https://www.cnblogs.com/charlesblc/p/6487336.html
86 How to create opengl context via drm (Linux)
https://stackoverflow.com/questions/23139886/how-to-create-opengl-context-via-drm-linux
87 ffmpeg 常见 命令
https://www.jianshu.com/p/2f9e31dd291f
88 单例模式
https://www.cnblogs.com/qiaoconglovelife/p/5851163.html
89 C++ Win32 编程
1.ShowWindow(SW_SHOWNORMAL) 参数 :
SW_HIDE
激活另外一个窗口,当前窗口就跑到那个窗口后面了
SW_MAXIMIZE
显示的窗口是最大化的
SW_MINIMIZE
显示的窗口是最小化的,并且自动把另一个窗口显示在前面
SW_SHOWMAXIMIZED
显示的窗口是最大化的,没有激活其他窗口的操作
SW_SHOWMINIMIZED
显示的窗口是最小化的,没有激活其他窗口的操作
SW_SHOWMINNOACTIVE
显示的窗口是最小化的,但窗口并不激活,就是说不显示在最上层,窗口标题栏是灰色的,没有激活其他窗口的操作
SW_SHOWNA
按窗口当前大小显示,但不激活,没有激活其他窗口的操作
SW_SHOWNOACTIVATE
按窗口最近一次显示时的大小和位置显示,窗口不激活
SW_SHOWNORMAL
不管窗口当前状态怎么样,都把它显示出来,并激活窗口
2. //获取客户端区域
RECT rect;
GetClientRect(m_PlayWnd->m_hWnd,&rect);
InvalidateRect(m_PlayWnd->m_hWnd,&rect,TRUE);
InvalidateRect 该函数向指定的窗体更新区域添加一个矩形,然后窗口客户区域的这一部分将被重新绘制。
InvalidateRect(hwnd, NULL, false);重画时不擦除背景
3. Win32 显示视频流
https://blog.csdn.net/leixiaohua1020/article/details/40266503
4. CreateWindow
API 函数原型:
HWND WINAPI CreateWindow(
_In_opt_ LPCTSTR lpClassName, // 窗口类名称
_In_opt_ LPCTSTR lpWindowName, // 窗口标题
_In_ DWORD dwStyle, // 窗口风格,或称窗口格式
_In_ int x, // 初始 x 坐标
_In_ int y, // 初始 y 坐标
_In_ int nWidth, // 初始 x 方向尺寸
_In_ int nHeight, // 初始 y 方向尺寸
_In_opt_ HWND hWndParent, // 父窗口句柄
_In_opt_ HMENU hMenu, // 窗口菜单句柄
_In_opt_ HINSTANCE hInstance, // 程序实例句柄
_In_opt_ LPVOID lpParam // 创建参数
);
注:_In_ 说明该参数是输入的,_opt_ 说明该参数是可选参数(不是说没有参数,而是可以利用宏搭配参数)。
5. SetWindowPos 设置窗口位置
SetWindowPos(Me.hWnd, 0, 0, 1366, 768, 0)
90 valgrind 详细使用文档
http://www.valgrind.org/docs/manual/quick-start.html#quick-start.mcrun
Error explanations ; http://www.valgrind.org/docs/manual/mc-manual.html#mc-manual.errormsgs
definitely lost: 确定有内存泄漏,表示在程序退出时,该内存无法回收,也没指针指向该内存(首地址); indirectly lost: 间接内存泄漏,比如结构体中定义的指针指向的内存无法回收; possibly lost: 可能出现内存泄漏,比如程序退出时,没有指针指向一块内存的首地址了,但由其他某个指针能推算出首地址; still reachable: 程序没主动释放内存,在退出时候该内存仍能访问到,比如全局 new 的对象没 delete,由于操作系统会回收,所以此类问题可忽略; 最严重的是 definitely lost 和 indirectly lost,检测结果文件中已给出了具体函数和源文件。
91 static_cast reinterpret_cast dynamic_cast
前面的是C的风格,后面的是C++的风格(也是推荐使用的)。差别在于,static_cast更安全一些,对于指针操作的话,多了一些检查,例如无关指针就无法转换,父类指针向孩子指针,无法转换,常指针向非常指针无法转换,而前面的那个则是通吃,通常是下面四个转换的合体 reinterpret_cast 在低级编程以及硬件接口的开发过程中,常常需要将一个特定的物理内存地址赋值给一个指针。为此必须使用 reinterpret_cast操作符计算地址值。例子如下: void *p; // 将地址 0x5800FF 付给指针 p p = reinterpret_cast< void* > (0x5800FF); static_cast 通常这个运算符用来进行数值类型间的转化,比如int到float,也可以是自定义的某些数据类型的转化。这个操作符通常也可以用于类指针之间的转化,但是这个运算符在父类到子类的转化中没有做检查并不安全。 dynamic_cast 这个操作符专门用于指针或者引用操作,也可以进行point -> void 的操作。对父类和子类之间的指针装换这个操作具有类型检查的功能,比较安全!这里要注意的是,如果父类和子类之间没有虚函数(文档称为多态类),那么dynamic_cast不能执行转换,应采用static_cast来进行转换。
92 右值引用
93 fread fseek
int fseek( FILE *stream, long offset, int origin );
fseek第一个参数stream为文件指针
第二个参数offset为偏移量,正数表示正向偏移,负数表示负向偏移
第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET
SEEK_SET: 文件开头
SEEK_CUR: 当前位置
SEEK_END: 文件结尾
其中SEEK_SET,SEEK_CUR和SEEK_END依次为0,1和2.
简言之:
fseek(fp,100L,0);把文件内部指针移动到离文件开头100字节处;
fseek(fp,100L,1);把文件内部指针移动到离文件当前位置100字节处;
fseek(fp,-100L,2);把文件内部指针退回到离文件结尾100字节处。
size_t fread( void * buffer , size_t size , size_t count , FILE * stream );
功 能:
从一个文件流中读数据,读取 count个元素 ,每个元素 size字节.如果调用成功返回 值大于count。如不成功,返回实际读取的元素个数,小于count.
93 makefile
$<
第一个依赖文件的名称。
$?
所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。
$@
目标的完整名称。
$^
所有的依赖文件,以空格分开,不包含重复的依赖文件。
GCC/G++也提供了链接选项 -Wl,-Bstatic 和 -Wl,-Bdynamic 供用户指定链接动态库或者静态库。
95 不要试图把.a 文件和 .o 文件链接到一个 .a 文件里 !!!!
96 g++ 链接静态库
g++ foo.o libfoo.a -o foo
97 wildcard 扩展通配符 比如编译某个文件夹下所有的.c 就可以用这个函数
https://blog.csdn.net/xzongyuan/article/details/38082667
g++ 参数详解
https://blog.csdn.net/Sunshine_in_Moon/article/details/50396942
98 剥离输出文件的符号:
strip exe_d -o exe
99 . 判断模板数据类型
std::is_same<T, float>::value
100 bazel 教程
https://docs.bazel.build/versions/master/tutorial/cpp.html
101 模板类子类无法访问父类成员 C/C++ --- 符合模式 -- 否
102 gcc 同时链接静态库和动态库
gcc test.cpp -L. -Wl,-Bdynamic -ltestdll -Wl,-Bstatic -ltestlib -Wl,-Bdynamic
103 单例模式
https://zhuanlan.zhihu.com/p/37469260
104 ipp 使用方法 点击
105 匿名函数 lamda
[](int n)->float { return n+1; } //表明输入是int 输出是float 的函数
106 线程和协程 区别1.线程和进程:
线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。线程可与属于同一进程的其它线程共享进程所拥有的全部资源,但是其本身基本上不拥有系统资源,只拥有一点在运行中必不可少的信息(如程序计数器、一组寄存器和栈)。 2.线程、进程与协程: 线程和进程的操作是由程序触发系统接口,最后的执行者是系统;协程的操作则是程序员 协程存在的意义:对于多线程应用,cpu通过切片的方式来切换线程间的执行,线程切换时需要耗时(保持状态,下次继续)。协程,则只使用一个线程,在一个线程中规定某个代码块执行顺序。 协程的适用场景: 当程序中存在大量不需要cpu的操作时(io),适用于协程;
107 条件变量 互斥锁
1. wait(unique_lock, [](){return condition;} ) 条件满足时lock, 不满足时unlock 并等待, (lock_guard没有这么高级, lock_guard 会忽略wait 函数, 一直锁住线程)
wait()会去检查这些条件(通过调用所提供的lambda函数), 当条件满足(lambda函数返回true)
时返回。 如果条件不满足(lambda函数返回false), wait()函数将解锁互斥量, 并且将这个线程
(上段提到的处理数据的线程)置于阻塞或等待状态。 当准备数据的线程调用notify_one()通知
条件变量时, 处理数据的线程从睡眠状态中苏醒, 重新获取互斥锁, 并且对条件再次检查,
在条件满足的情况下, 从wait()返回并继续持有锁。 当条件不满足时, 线程将对互斥量解锁,
并且重新开始等待。 这就是为什么用 std::unique_lock 而不使用 std::lock_guard ——等待中
的线程必须在等待期间解锁互斥量, 并在这这之后对互斥量再次上锁, 而 std::lock_guard 没
有这么灵活。 如果互斥量在线程休眠期间保持锁住状态, 准备数据的线程将无法锁住互斥
量, 也无法添加数据到队列中; 同样的, 等待线程也永远不会知道条件何时满足