Возникли проблемы со связыванием статической библиотеки C ++
Вопрос
Я выяснил, как настроить VC ++ на компиляцию кода в .lib-файл вместо .exe, но у меня возникли проблемы с получением библиотеки для соединения с другими моими obj-файлами.
Вот как я настроил папки библиотеки и приложений.(Я не уверен, правильно ли это)
AppFolder
App.sln
App.ncb
*.h
*.cpp
Debug
*.obj
App.exe
и где-то еще на жестком диске...
LibraryFolder
lib
Library.lib
include
LibrarySolutionFolder
Library.sln
Library.ncb
*.h
*.cpp
Debug
*.obj
Library.lib
Я #включил файлы library *.h из cpp-файлов моего приложения, и все компилируется нормально.Просто, когда он ссылается, я получаю список всех файлов .lib , в которых выполняется поиск, а Library.lib там нет, хотя у меня он указан в каталогах VC ++.Как я могу передать это по ссылке?(И правильно ли я структурирую папки библиотеки?)
Решение
О свойствах проекта:
Свойства конфигурации - > Линкер - > Ввод - > Дополнительные зависимости
Добавьте его туда.
Или в своем .h файле для библиотеки добавьте:
#pragma comment(lib, "Library")
Это сделает это автоматически для вас.
Другие советы
Каталоги VC ++ - это список местоположений каталогов, которые нужно искать во время компоновки. Это не список библиотек, с которыми нужно связываться.
Вам необходимо добавить файл lib в поле Дополнительные зависимости в настройках Project Linker . р>
Чтобы связать с библиотекой, вы можете либо:
- Укажите это в Project-> Properties ...-> Linker, Input-> Дополнительные зависимости (Каталоги VC ++ позволяют использовать только имя библиотеки ., а не полный путь),
- Добавьте проект библиотеки в свое приложение.решение (В разделе решение щелкните правой кнопкой мыши -> Добавить -> Существующий проект ...), затем используйте Проект -> Зависимости проекта ..., затем проверьте проект вашей библиотеки (убедитесь, что в раскрывающемся списке выбран проект приложения).Вероятно, это лучший способ, если вы редактируете оба проекта, поскольку VC ++ перестроит библиотеку, если она была изменена до создания вашего приложения.
Если вы уверены, что будете использовать только VC ++,
#pragma comment(lib,"C:\\path\\to\\library.lib")`
(Спасибо @Nils)
Примечание:Кажется очень странным, что ваша папка с библиотечным решением находится внутри каталога "include":которые действительно предназначены для *.h (или других #include
файлы d).
Из командной строки:
cl / EHsc {objfiles} + / ссылка / LIBPATH: LibraryFolder Library.lib
Где {objfiles} + означает один или несколько файлов объектов или cpp. Р>
VC не просто связывает библиотеку, если вы включаете заголовочный файл.
Вы должны указать компоновщику использовать библиотеку. По уважительным причинам: у вас уже есть тысячи библиотек в вашей папке библиотеки. Если бы MSVC приходилось искать все из них каждый раз, когда вы связываете свою программу, ей пришлось бы разбираться в сотнях мегабайт данных. Р>
Это займет много времени, поэтому по умолчанию это не делается.
Для VC вы также можете дать подсказку компоновщику внутри вашего источника. Для этого вы добавляете следующую строку где-нибудь в свой исходный код (заголовок библиотеки может быть хорошим местом).
#pragma comment(lib,"c:\\path_to_library\\libname.lib")
Это не зависит от платформы, но является наиболее удобным способом автоматически связать библиотеку с проектом с помощью MSVC.
Другой способ - просто добавить компоновщик в настройки проекта. Соответствующую информацию можно найти в настройках линкера вашего проекта. Не забудьте добавить lib в конфигурацию выпуска и отладки.