当使用-O0时,g++在未定义的引用上停止

g++ stops on undefined reference when using -O0

本文关键字:未定义 引用 g++ -O0      更新时间:2023-10-16

我想调试我编写的程序。因此,我想用"-g-O0"链接它。当我使用编译(使用autotools Makefile(时

使CXXFLAGS="-g-O0">

我得到一些错误:

libtool:link:g++-O2-g-O0-I/opt/adolc-2.2.1/include-o oc_poly oc_poly-oc_poly.ooc_poly-oc_pp.o-L/opt/ipopt-3.9.3/lib/coin-L/opt/ippot--3.9.3/lib/coin/ThirdParty-L/usr/lib/i386 linux gnu/gcc/i686 linux gnu/4.5.2-L/usr/lib/i386 linux gnu/gcc/i686-linux gnu/4.5.2/../../..-L/usr/lib/i386 linux gnu/opt/ippot-3.9/lib/coin/libipopt.so-llapack-ldl/opt/ippot--3.9.3/lib/coin/ThirdParty/libcoinhsl.so/opt/ipopt-3.9.3/lib/coin/ThirdParty/libcoinblast.so/opt/ipopt-3.9.3/lib/coin/Third Party/libconilapack.so/opt/ippot-3.9.3/lib/coin/ThirdParty/libconomps.so-lpthread-lblas-lgfortran-lm-lgcc_s/opt/ipopt-3.9.3/lib/coin/ThirdParty/libcoimetis.so-L/opt/adolc-2.2.1/lib/opt/adolc-2.2.1/lib/libadoldc.so-Wl,-rpath-Wl,/opt/ipopt-3.9.3/lib/coin-Wl,-r path-Wl,/opt/ipopt-3.9.3/lib/coin/ThirdParty-Wl,-rpath-Wl,/opp/adolc-2.1/lib-Wl,-r path-Wl,/opt/ipopt-3.9.3/lib/coin-Wl,-rpath-Wl,/opt/ipopt-3.9.3/lib/coin/ThirdParty-Wl,-rpath-Wl,/opt/adolc-2.1/liboc_poly-oc_pp.o:在函数OCP_P2P::get_bounds_info(int, double*, double*, int, double*, double*)': /home/christian/Dokumente/Uni/SA/ist/Berechnungen/Optimale Steuernug/IpOpt /oc_p2p.cpp:162: undefined reference to中OCP_p2p::INF'

所提到的符号INF是在类定义OCP_P2P中定义的静态类成员。

如果我省略CXXFLAGS或将它们设置为O1、O2、O3或Os的任何优化值,则链接工作得非常好。我使用g++4.5.2。

有人能给我一个提示吗,这里出了什么问题?如何调试程序?

感谢

Christian

静态类成员变量需要定义;即使它是在类定义中初始化的,这只是一个声明。换句话说,你需要把

const double OCP_P2P::INF;

cpp文件中的某个位置。据推测,当启用优化时,变量的使用被优化掉了。

官方规则是,根据标准对使用的定义,如果使用的变量,则需要定义,这基本上是如果使用了指向变量的指针,或者变量绑定到引用。