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

时间:2011-08-07 13:11:32

标签: c++ optimization reference g++ undefined

我想调试我写的程序。因此我想用“-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.o   oc_poly-oc_p2p.o -L / opt / ipopt-3.9.3 / lib / coin -L / opt / ipopt-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/ipopt-3.9.3/lib/coin/libipopt.so   -llapack -ldl /opt/ipopt-3.9.3/lib/coin/ThirdParty/libcoinhsl.so /opt/ipopt-3.9.3/lib   /coin/ThirdParty/libcoinblas.so /opt/ipopt-3.9.3/lib/coin/ThirdParty/libcoinlapack.so   /opt/ipopt-3.9.3/lib/coin/ThirdParty/libcoinmumps.so -lpthread -lblas -lgfortran -lm   -lgcc_s /opt/ipopt-3.9.3/lib/coin/ThirdParty/libcoinmetis.so -L / opt / adolc-2.2.1 / lib   /opt/adolc-2.2.1/lib/libadolc.so -Wl,-rpath -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.2.1 / lib -Wl,-rpath   -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.2.1 / lib   oc_poly-oc_p2p.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。

任何人都可以给我一个提示,这里出了什么问题?我该如何调试我的程序?

由于

基督教

1 个答案:

答案 0 :(得分:5)

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

const double OCP_P2P::INF;

在cpp文件中的某个地方。据推测,当启用优化时,变量的使用已经过优化。

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