g ++ ссылки .so библиотеки, которые еще не могут быть скомпилированы - PullRequest
0 голосов
/ 11 февраля 2012

Я помогаю в приложении C ++.Приложение очень большое и распределено по разным подкаталогам.Он использует скрипт для автоматической генерации файлов qt .pro для каждого каталога проекта и использует qmake для генерации файлов make.В настоящее время библиотеки компилируются в алфавитном порядке ... что, очевидно, приводит к ошибкам компоновки, когда библиотека, к которой она пытается подключиться, еще не создана. Есть ли какой-нибудь флаг g ++, который я могу установить, чтобы он не выдавал ошибку, если библиотекаПопытка ссылки еще не была построена?или как сделать так, чтобы он сначала строил зависимости через файл qt .pro?

ПРИМЕЧАНИЕ. Этот сценарий прекрасно работает в Ubuntu 10.10, потому что операторы для создания разделяемых библиотек не требуют использования -l (имя_библиотеки)ссылка на мои другие библиотеки, но Ubuntu 11.10 делает так, что он дает мне неопределенные ошибки ссылки при компиляции 11.10.

Ответы [ 2 ]

1 голос
/ 11 февраля 2012

Вы можете использовать проект subdirs, чтобы контролировать порядок сборки (независимо от того, хочет это другой разработчик или нет :)).

* 1003 Е.Г. *

build_all.pro

TEMPLATE=subdirs
CONFIG+=ordered
SUBDIRS=lib2/lib2.pro lib1/lib1.pro app/app.pro

lib1.pro, lib2.pro, ... - ваши сгенерированные профессиональные файлы. Затем запустите qmake один раз для build_all.pro, а также запустите make в этом каталоге. Это создаст lib2 до lib1 и затем app.

1 голос
/ 11 февраля 2012

Рассматривали ли вы использование Qt Creator в качестве среды сборки и IDE?Лично я никогда не использовал его для разработки на Ubuntu, но я использовал его на Windows с g ++, и там он прекрасно работает.И кажется, что он уже доступен как пакет в репозитории .

Некоторые из преимуществ, которые вы получите, используя его:

  • Qt Creator будет (обычно) управлять файлами .pro для вас.(Если вы похожи на меня, вы все равно можете добавить здесь много дополнительных вещей, но он автоматически добавит файлы .cpp, .h и .ui по мере их добавления в проект.)
  • Вы можетеустановить межпроектные зависимости, которые будут создавать проекты в любом порядке, в котором они должны ссылаться.
  • Вы можете использовать его интеграцию с gdb для пошагового выполнения и отладки кода, а также для перехода к коду.
  • Вы получаете автозаполнение сигналов и слотов Qt, а также подсветку встроенного синтаксиса и некоторую проверку ошибок.
  • Если вы работаете с графическим интерфейсом, вы можете использовать встроенный конструктор для визуального макета и разработки форм.

Возвращаясь к вашему актуальному вопросу, я не думаю, что у флага есть возможность сказать gcc, чтобы он не выдавал ошибку, когда ссылка не работает, просто потому, что у компоновщика нет возможности лениво связывать библиотеки.Если он связан со статическими библиотеками (.a), то он должен иметь возможность фактически скопировать реализацию этого кода в исполняемый файл / библиотеку.Если это динамическое связывание (.so), ему все еще нужно проверить, что требуемые функции действительно существуют в библиотеке.Если он не может связать его во время шага связывания, когда он может связать?

В качестве запоздалой мысли, если в процессе компиляции есть циклические зависимости (A зависит от B, B от C, иC на A), тогда вам может понадобиться создать поддельную версию библиотеки, в которой есть только пустые заглушки для реализации каждой функции и полное определение для каждого класса или объекта.Затем соберите все остальное, связавшись с ним, и, наконец, соберите реальную версию поддельной библиотеки и свяжите ее со всеми другими версиями, которые уже были связаны.Я думаю, что это будет работать только на динамическое связывание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...