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
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
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
{
const regex pattern(pattern_t);
std::sregex_token_iterator p(in.begin(), in.end(), pattern);
std::sregex_token_iterator end;
std::vector
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
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#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
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);
}