Неудовлетворенные символы в отладке, но не выпуск
Вопрос
Я строю что -то на HPUX. Код работает нормально в Sun/Linux/AIX.
Но на HPUX он жалуется на
[sshexec] /usr/ccs/bin/ld: Unsatisfied symbols:
[sshexec] globalVar (first referenced in blah.o)
Еще раз код работает в выпуске, но не в отладке. Все, что он делает, использует глобальную переменную, определенную в каком -то другом файле
extern globPck globalVar;
Globpck - это класс, который сочетает в себе некоторые глобальные вещи.
Меня больше интересуют идеи, что может быть причиной для этого в выпуске, но не в отладке.
Я просмотрел файлы .i (предварительный файл заголовка, сгенерированный с -e), и, кажется, определяется таким же образом.
Я предполагаю, что что -то, что попадает в код выпуска, исправляет его, но я здесь, чтобы услышать, есть ли у вас некоторые идеи.
Решение
Первое, что нужно сделать, когда линкера жалуется, что что -то не определено, это найти для себя, где эта вещь является определенный. Если вы не можете его найти, не ожидайте, что линкера тоже его найдет.
То, что вы показали, - это объявление, а не определение. Определение не будет иметь extern
ключевое слово. Должно быть определение именно в одном .cpp Файл в ваш проект, а не заголовок.
После того, как вы нашли определение, вы можете начать работать над тем, почему линкер не видит его. Может быть, это определено только тогда, когда присутствуют определенные символы, например DEBUG
или же NDEBUG
.
Если нет определения, то, возможно, все Использование из него удаляется во время компиляции высвобождения (возможно, потому что все использование происходит в assert
утверждения, которые компилятор пропускает), поэтому недостающее определение не замечено в режиме выпуска.
Другие советы
Компилятор HPUX любит «оптимизировать» вызовы конструкторов в глобальные классы, если классы доступны только косвенно из основного пути выполнения. Попробуйте добавить простой printf () со значением переменной в вашем основном потоке где -нибудь, посмотрите, если проблема не соответствует.