Неудовлетворенные символы в Debug, но не в Release - PullRequest
1 голос
/ 04 января 2011

Я что-то строю на HPUX.Код прекрасно работает в Sun / Linux / AIX.

Но в HPUX он жалуется на

[sshexec] /usr/ccs/bin/ld: Unsatisfied symbols:
[sshexec]    globalVar (first referenced in blah.o)

Еще раз код работает в Release, но не в Debug.Все, что он делает, это использует глобальную переменную, определенную в каком-то другом файле

extern globPck globalVar;

globPck - это класс, который содержит некоторые глобальные вещи.

Меня больше интересуют идеи, что может быть причиной для этогоработать в Release, но не в Debug.

Я просмотрел файлы .i (предварительно скомпилированный заголовочный файл, созданный с помощью -E) И он определен таким же образом.

Я предполагаю, что что-то ударилов Release code path исправляет это, но я здесь, чтобы узнать, есть ли у вас идеи.

Ответы [ 2 ]

3 голосов
/ 05 января 2011

Первое, что нужно сделать, когда компоновщик жалуется, что что-то не определено, - это найти для себя, где эта вещь определена .Если вы не можете найти его, то не ожидайте, что компоновщик его тоже найдет.

То, что вы показали, это объявление, а не определение.Определение не будет содержать ключевое слово extern.В вашем проекте должно быть определение ровно в одном .cpp файле, а не в заголовке.

Как только вы нашли определение, вы можете начать работать над тем, почему компоновщик не 'не вижу этого.Может быть, он определяется только при наличии определенных символов, таких как DEBUG или NDEBUG.

Если определения нет, то, возможно, все , использующие , будут удалены во время компиляции релиза (возможно, потому что все применения происходят в assert операторах, которые компилятор пропускает), поэтому отсутствующее определение не замечено в режиме выпуска.

0 голосов
/ 14 мая 2014

Компилятор HPUX любит "Оптимизировать" вызовы конструктора для глобальных классов, если доступ к классам осуществляется только косвенно из основного пути выполнения. Попробуйте добавить простой printf () со значением переменной в вашем основном потоке и посмотрите, исчезнет ли проблема.

...