C++ 笔记

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.9   当前不会命中断点 还没有为该文档加载任何符号

      项目-〉属性-〉配置属性-〉链接器-〉调试-〉优化以便于调试。

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"  用法

  未加extern "C"声明时的连接方式
  假设在C++中,模块A的头文件如下:
// 模块A头文件 moduleA.h
#ifndef MODULE_A_H
#define MODULE_A_H
int foo( int x, int y );
#endif
  在模块B中引用该函数:
// 模块B实现文件 moduleB.cpp
#include "moduleA.h"
foo(2,3);
  实际上,在连接阶段,连接器会从模块A生成的目标文件moduleA.obj中寻找_foo_int_int这样的符号!
  加extern "C"声明后的编译和连接方式
  加extern "C"声明后,模块A的头文件变为:
// 模块A头文件 moduleA.h
#ifndef MODULE_A_H
#define MODULE_A_H
extern "C" int foo( int x, int y );
#endif
  在模块B的实现文件中仍然调用foo( 2,3 ),其结果是:
  (1)模块A编译生成foo的目标代码时,没有对其名字进行特殊处理,采用了C语言的方式;
  (2)连接器在为模块B的目标代码寻找foo(2,3)调用时,寻找的是未经修改的符号名_foo。
  如果在模块A中函数声明了foo为extern "C"类型,而模块B中包含的是extern int foo( int x, int y ) ,则模块B找不到模块A中的函数;反之亦然。
 
24  CUDA 
24.1 编译出现错误 : ptxas fatal : Unresolved extern function xxxx    

第一是两个函数放到同一个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,56, 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 解决方法

4
3 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 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("\n ptr = [%s]\n", ptr);
    ptr[0] = 'a';
    printf("\n ptr = [%s]\n", 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\n", 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  右值引用

https://mp.weixin.qq.com/s?src=3&timestamp=1575598586&ver=1&signature=9f4rYV9MBZ2kbADkjAGQaHVrpS8WOUrpbzC12pflTBFEkNHIJU-zjK2KLlyk-RVltxqpAKdmbwzaNBGRt2dhluKtXI7WV-b7r4VSXlswLKFDRU-7o-vzNlQN0*5OSgoLSj1*-wjPlvNWDZZwTpFGeg==

 

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
么灵活。 如果互斥量在线程休眠期保持住状, 准数据的线程将无法住互斥
量, 也无法添加数据到列中; 同的, 等待线程也永不会知道条件何时满

理数据可能是一个耗的操作, 并且如你在第3到的, 你就知道持有
时间过长是一个多么糟糕的主意。



107 define 的骚用法 可以实现模板
define 字符串连接以及变量名分段联结用法
    #define  A(x)            ##x
    #define  B(x)            #@x

    #define  C(x)            #x

如果我们假设x=a,那么A(a)就是a,B(a)就是‘a’,C(1)就是”a“








posted @ 2016-10-14 09:35  洛笔达  阅读(1249)  评论(0编辑  收藏  举报