Настройка системы сборки, где X зависит от Y, который зависит от Z, помогает. Когда вы попадаете в круги (Z зависит от X), все становится ужасно.
Часто библиотеки порядка связаны ("-lZ -lY -lX" против "-lX -lY -lZ"), что вызывает горе. В более редких случаях у вас есть одно и то же имя библиотеки в нескольких местах в пути поиска или вы ссылаетесь на устаревшие версии, которые еще не были перекомпилированы.
"nm --demangle" позволяет увидеть, где что-то определено / используется.
"ldd" можно использовать, чтобы увидеть, от каких динамических библиотек вы зависите.
Флаг gcc / g ++ -print-file-name = LIBRARY может помочь точно определить, какая библиотека используется.
Запоздалая мысль: (Поскольку вы спрашиваете о правилах / руководящих принципах.)
Можно настроить систему make-файлов так, чтобы:
- Если модуль = D зависит от модулей A, B и C.
- Тогда попытка создать модуль = D сначала создаст модули A, B и C.
- И, что более важно, module = D будет автоматически определять свои библиотеки (-lA и т. Д.), Пути к библиотекам (-LA) и включать пути (-IA) из make-файлов для модулей A, B и C.
Это может стать немного волосатым. В прошлый раз, когда я делал это, я предпочитал просто кэшировать информацию, а не разветвлять чрезмерное количество подпроцессов make. В сочетании с импортом makefile и небольшим Perl-скриптом для удаления дубликатов. Клуджи, я знаю. (Силам, которые не хотят тратить время на инфраструктуру.) Но это можно сделать.
Опять же, я использовал GNU-make, который имеет несколько расширений.