Неудовлетворенные символы в отладке, но не выпуск

StackOverflow https://stackoverflow.com/questions/4598165

  •  15-10-2019
  •  | 
  •  

Вопрос

Я строю что -то на 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 () со значением переменной в вашем основном потоке где -нибудь, посмотрите, если проблема не соответствует.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top