g ++ останавливается на неопределенной ссылке при использовании -O0 - PullRequest
0 голосов
/ 07 августа 2011

Я хочу отладить программу, которую я написал.Поэтому я хотел бы связать его, используя "-g -O0".Когда я компилирую (используя make-файл автоинструментов), используя

make CXXFLAGS = '- g -O0'

, я получаю некоторые ошибки:

libtool: ссылка: 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 Ответ

5 голосов
/ 07 августа 2011

Статическая переменная-член класса нуждается в определении;даже если он инициализирован в определении класса, который является только объявлением.Другими словами, вам нужно поместить

const double OCP_P2P::INF;

где-нибудь в файл cpp.Предположительно, когда оптимизация была включена, использование переменной было оптимизировано.

Официальное правило состоит в том, что определение необходимо, если переменная используется , согласно определению стандарта used , что, в основном, если взять указатель на переменную или если переменная связана со ссылкой.

...