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

 

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

 将一个目录强行指定为.so的搜索目录

include foo.make *.mk $(bar)   包含文件

-Wl,-rpath,/usr/local/lib   指定运行时库目录

 

15  类、模板

1. 带参数构造函数初始化

C++ 笔记_第1张图片

 

2,  模板函数的特化

C++ 笔记_第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

    C++ 笔记_第3张图片   ---->然后点开全部设置为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 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 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 

 #include   在 之前包含

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   函数指针做形参

C++ 笔记_第4张图片

 

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 在数据中的存储结构

C++ 笔记_第5张图片

 

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
#include
#include<set>
#include<string>
#include
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 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::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::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 
#include 
#include 
#include//因为用了sort()函数  
#include//因为用了greater() 
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
#include<string.h>
#include

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);
}

 

转载于:https://www.cnblogs.com/luoyinjie/p/7219337.html

你可能感兴趣的:(C++ 笔记)