Я работаю над очень большим проектом, в котором есть несколько проектов Visual Studio. Эти проекты построены как статические библиотеки и включены в основной проект, назовем его Main.exe
,
Я создал новый проект и построил его как статическую библиотеку, давайте назовем его MyProj.lib
, Эта библиотека зависит от другой статической библиотеки, назовем ее API.lib
,
Теперь мне нужно связать свой проект с основным проектом. В настоящее время у меня есть обе статические библиотеки, связанные с основным проектом. Я ранее задавал этот вопрос: Связать статическую библиотеку с другой статической библиотекой и обнаружил, что я не могу вкладывать статические библиотеки. Пол Михалик отметил, что мне нужно просто связать две библиотеки независимо, когда я создаю основной проект.
Теперь я получаю несколько LNK2019
ошибки от MyProj.lib
библиотека, говоря, что она не может найти символы, которые определены в API.lib
библиотека. Visual Studio знает, где находятся оба библиотечных файла, поэтому меня это очень смущает. Есть идеи?
Такая путаница проистекает из ошибочного мнения, что файлы .lib каким-то образом волшебны. Чтобы компоновщик мог увидеть что у файла .lib есть другие зависимости. Это просто не тот случай, статический .lib — это просто пакет файлов .obj. Способ собрать выходные данные компилятора в один файл. Ни больше ни меньше.
Что особенно смущает, так это то, что когда вы строить библиотека, она никогда не будет жаловаться на отсутствующие зависимости. Объяснение этому простое, создание библиотеки делает не запустить компоновщик. Просто инструмент lib.exe, который собирает файлы .obj в пакет.
Он не сработает, пока вы на самом деле не запустите компоновщик для создания окончательного исполняемого файла. Теперь все кусочки должны собраться вместе, линкер имеет также увидеть файл .obj или .lib, который содержит зависимости. Он жалуется, когда нет.
Это очень слабое звено в модели сборки C / C ++, которое трудно исправить. Продавцы пытались решить эту проблему, Microsoft тоже. Они добавили нестандартную функцию #pragma comment (lib, «thing.lib «), чтобы сообщить компоновщику, что ему нужно связать файл «thing.iib» без явного указания его в настройке дополнительных зависимостей компоновщика. Очень хорошо. Имея дело именно с где Файл «thing.lib «хранится, однако это проблема, с которой вам нужно иметь дело. Crud. Еще одна настройка.
Самое простое решение — просто добавить .lib
файлы для каждого из проектов, которые полагаются на них. В случае, если это имеет значение (вероятно, не для VS), поместите зависимую библиотеку перед зависимой библиотекой.
(Возможный) недостаток этого заключается в том, что библиотеки не перекомпилируются автоматически при их изменении.