Возникли проблемы со связыванием статической библиотеки C ++

StackOverflow https://stackoverflow.com/questions/223919

  •  03-07-2019
  •  | 
  •  

Вопрос

Я выяснил, как настроить 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 в конфигурацию выпуска и отладки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top