Неопределенная ссылка на .. error (Linux) — прекрасно компилируется в OSX

Потратили почти полные 4 дня, пытаясь скомпилировать этот пакет. Он хорошо компилируется в OSX 10.6, но выдает неопределенные ошибки ссылок, когда я пытаюсь скомпилировать его на компьютере с Linux (ядро Kubuntu 10.04, 3.8.0.27).

Кажется, ошибка в том, что make-файлы упорядочены неправильно, но AFAIK, я единственный, у кого возникли проблемы с его компиляцией. Итак, я пытаюсь найти, что имеет значение. Программный пакет довольно большой, и редактирование Makefiles и перемещение 30-50 библиотек здесь и там не кажутся хорошей идеей.

Вот различия, я думаю, я нашел до сих пор

  • Компилятор — НКУ-4,7 (Linux) и LLVM-GCC-4.2 (OSX)
  • Флаги компилятора —общий (Linux) и -динамический -dynamiclib -неопределенный dynamic_lookup (OSX)

У кого-нибудь есть предложения?

  1. Я пытался с помощью clang++ а также llvm-gcc-4.7 как компилятор, но я думаю, что он все еще использовал тот же компоновщик (ld?). Так что я мог бы попытаться указать, чтобы использовать llvm? Как я могу это сделать?

  2. является --shared флаг как-то отличается от dynamic -dynamiclib -undefined dynamic_lookup флаги в OSX?

  3. Имеет ли значение ядро ​​или дистрибутив Linux? (Я думаю, что они отлично скомпилировали на машине с CentOS)

Пожалуйста помоги.
Большое спасибо.

0

Решение

Скомпилировал его с gcc 4.4 и работал без нареканий. Я думаю, что заказ не имеет значения на 4.4 для данного пакета.

1

Другие решения

неопределенные ссылки Тип ошибок может быть вызван тем, что символ не компилируется, не связан или не связан по порядку. Способ отладки заключается в проверке строки компоновщика, символа, на который ссылается компоновщик. Сообщение об ошибке, вероятно, скажет вам, какой объектный файл имеет зависимость.

Теперь вам нужно выяснить, скомпилирован ли символ или скомпонован, для этого вам нужно будет узнать, находится ли он в каком-либо из объектных файлов или в какой-либо из библиотек и в каких. Вы можете использовать nm инструмент командной строки для перечисления символов, которые определены в любом заданном .o или библиотеке. Если символа там нет, то вам нужно выяснить, что добавить к строке компоновщика, и это решит его.

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

Как простой мотыга, хотя я рекомендую против этого, вы можете поручить компоновщику gcc сделать несколько проходов, используя --start-group а также --end-group параметры командной строки. Хотя я действительно рекомендую вам выяснить порядок зависимостей, так как это также поможет вам лучше понять ваш проект.

0

По вопросам рекламы [email protected]