UNIX 环境下C++编译运行常见错误

代码运行的时候报错

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分成多个选项,然后传递给链接程序。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值