代码运行的时候报错
1.原因:读取内存越界
问题描述:
编译的时候出现如下告警,将int型的转化成unsigned型,导致越界。
warning: comparison between signed and unsigned integer expressions
terminate called after throwing an instance of 'std::out_of_range'
what(): basic_string::replace
2. 原因:对一个空指针进行操作。
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_S_construct NULL not valid
代码编译的时候报错
1.原因:类构造函数初始化顺序,需要和声明顺序一致。
解决方法:调整类初始化顺序
warning: ‘CTcpClient::data_socket_’ will be initialized after
2. 原因:程序依赖DB2客户端动态lib库,需要设置LD_LIBRARY_PATH,这个需要对C++ 动态库编译工作原理有一定的了解,这个后续在介绍。
解决方法:将DB2客户端lib库加入到LD_LIBRARY_PATH,注意修改环境变量需要用. 或者source命令使环境变量生效。
/usr/bin/ld: warning: libdb2dascmn.so.1, needed by ./lib_third/linux/lib64/libdb2.so, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libdb2g11n.so.1, needed by ./lib_third/linux/lib64/libdb2.so, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libdb2genreg.so.1, needed by ./lib_third/linux/lib64/libdb2.so, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libdb2install.so.1, needed by ./lib_third/linux/lib64/libdb2.so, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libdb2locale.so.1, needed by ./lib_third/linux/lib64/libdb2.so, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libdb2osse.so.1, needed by ./lib_third/linux/lib64/libdb2.so, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libdb2osse_db2.so.1, needed by ./lib_third/linux/lib64/libdb2.so, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libdb2trcapi.so.1, needed by ./lib_third/linux/lib64/libdb2.so, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libstdc++.so.5, needed by ./lib_third/linux/lib64/libdb2.so, may conflict with libstdc++.so.6
./lib_third/linux/lib64/libdb2.so: undefined reference to `OSSDecimal64FromString(char const*)'
./lib_third/linux/lib64/libdb2.so: undefined reference to `OSSHLibrary::isLoaded()'
./lib_third/linux/lib64/libdb2.so: undefined reference to `OSS_DECIMAL64_NEG_SNAN'
./lib_third/linux/lib64/libdb2.so: undefined reference to `ossLogRC'
./lib_third/linux/lib64/libdb2.so: undefined reference to `sqlnlssplitcp2'
./lib_third/linux/lib64/libdb2.so: undefined reference to `sqlnlsFormatDate'
./lib_third/linux/lib64/libdb2.so: undefined reference to `OSSDecfloat::fromString(char const*, rounding)'
./lib_third/linux/lib64/libdb2.so: undefined reference to `dfpalInit(void*)'
./lib_third/linux/lib64/libdb2.so: undefined reference to `g_pGTCB'
./lib_third/linux/lib64/libdb2.so: undefined reference to `decimal64Minus(decimal64)'
./lib_third/linux/lib64/libdb2.so: undefined reference to `OSSHFile::read(OSSFileReadParam const*, void*, unsigned long*)'
./lib_third/linux/lib64/libdb2.so: undefined reference to `ossComputeMontgomeryInverse32'
./lib_third/linux/lib64/libdb2.so: undefined reference to `sqlnlsschr'
./lib_third/linux/lib64/libdb2.so: undefined reference to `sqloGetEnvLocale'
./lib_third/linux/lib64/libdb2.so: undefined reference to `decimal128FromNumber(decimal128*, decNumber const*, decContext*)'
./lib_third/linux/lib64/libdb2.so: undefined reference to `gtraceEnable'
./lib_third/linux/lib64/libdb2.so: undefined reference to `sqlnlsgetctryinfo'
./lib_third/linux/lib64/libdb2.so: undefined reference to `OSSHFile::sync()'
./lib_third/linux/lib64/libdb2.so: undefined reference to `OSSTrapFile::OSSTrapFile()'
./lib_third/linux/lib64/libdb2.so: undefined reference to `OSS_DECIMAL64_NAN'
3. 原因:需要依赖低版本GCC库,错误很清楚,需要依赖libstdc++.so.5
查看了下机器中libstdc版本只有libstdc++.so.6.0.13,从而导致编译的时候出现下面错误,
解决方法:下载libstdc++.so.5 上传到对应目录下面就OK了。
/usr/bin/ld: warning: libstdc++.so.5, needed by ./lib_third/linux/lib64/libdb2.so, not found (try using -rpath or -rpath-link)
./lib_third/linux/lib64/libdb2.so: undefined reference to `vtable for __cxxabiv1::__si_class_type_info@GLIBCPP_3.2'
./lib_third/linux/lib64/libdb2.so: undefined reference to `operator new[](unsigned long)@GLIBCPP_3.2'
./lib_third/linux/lib64/libdb2.so: undefined reference to `operator new(unsigned long)@GLIBCPP_3.2'
./lib_third/linux/lib64/libdb2.so: undefined reference to `__cxa_vec_delete2@CXXABI_1.2'
./lib_third/linux/lib64/libdb2.so: undefined reference to `__cxa_vec_dtor@CXXABI_1.2'
./lib_third/linux/lib64/libdb2.so: undefined reference to `__cxa_pure_virtual@CXXABI_1.2'
./lib_third/linux/lib64/libdb2.so: undefined reference to `operator delete[](void*)@GLIBCPP_3.2'
./lib_third/linux/lib64/libdb2.so: undefined reference to `vtable for __cxxabiv1::__vmi_class_type_info@GLIBCPP_3.2'
./lib_third/linux/lib64/libdb2.so: undefined reference to `__cxa_vec_ctor@CXXABI_1.2'
./lib_third/linux/lib64/libdb2.so: undefined reference to `operator delete(void*)@GLIBCPP_3.2'
./lib_third/linux/lib64/libdb2.so: undefined reference to `__gxx_personality_v0@CXXABI_1.2'
./lib_third/linux/lib64/libdb2.so: undefined reference to `vtable for __cxxabiv1::__class_type_info@GLIBCPP_3.2'
总而言之:
安装编译有时是个很繁琐的过程,不同的机器环境,gcc编译器版本不同都会导致编译出现问题,下面在贴上gcc 编译常用选项给大家做个参考。
g++(gcc)编译选项
-shared :指定生成动态链接库。
-static :指定生成静态链接库。
-fPIC :表示编译为位置独立的代码,用于编译共享库。目标文件需要创建成位置无关码,理论就是在可执行程序装载它们的时候,它们可以放在可执行程序的内存里的任何地方。
-L. :表示要连接的库所在的目录。
-l:指定链接时需要的动态库。编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.a/.so来确定库的名称。
-Wall :生成所有警告信息。
-ggdb :此选项将尽可能的生成gdb 的可以使用的调试信息。
-g :编译器在编译的时候产生调试信息。
-c :只激活预处理、编译和汇编,也就是把程序做成目标文件(.o文件) 。
-Wl,options :把参数(options)传递给链接器ld 。如果options 中间有逗号,就将options分成多个选项,然后传递给链接程序。