Как “добавить ссылку” в C++

Лучший способ убедить... находит ошибку, пишет модульный тест на него, исправляет ошибку.

, Что особая ошибка вряд ли будет когда-либо появляться снова, и можно доказать его с тестом.

, Если Вы делаете это достаточно, другие уловят смысл быстро.

14
задан Dima 21 August 2009 в 15:50
поделиться

4 ответа

Часто библиотека поставляется с 1) файлом заголовка (.h) и 2) файлом .lib в дополнение к .dll.

Заголовочный файл имеет # include'ed в вашем коде, чтобы предоставить вам доступ к объявлениям типов и функций в библиотеке.

.lib связан с вашим приложением (свойства проекта -> компоновщик -> ввод, дополнительные зависимости).

Файл .lib обычно содержит простые заглушки, которые автоматически загружают DLL и пересылают в нее вызовы функций.

Если у вас нет файла .lib, вместо этого вам придется использовать функцию LoadLibrary для динамической загрузки библиотеки DLL.

24
ответ дан 1 December 2019 в 07:19
поделиться

В C ++ нет библиотек в том смысле, о котором вы думаете. У него есть файлы заголовков, которые вы #include , и есть вещи, называемые библиотеками, с которыми работает компоновщик, которые содержат скомпилированный код. Вам необходимо добавить библиотеки (файлы .LIB) в настройки компоновщика.

В Windows, если вы используете DLL, в идеале у вас должен быть файл .LIB, который называется библиотекой импорта для DLL. , и вы добавляете этот файл .LIB в настройки компоновщика.

4
ответ дан 1 December 2019 в 07:19
поделиться

Основная концепция заключается в следующем: Есть 2 типа библиотек: статические и динамические. Разница между ними в том, что статические библиотеки на этапе компоновки встраивают свой скомпилированный код в ваш исполняемый файл (или dll); динамические библиотеки просто встраивают указатели на функции и инструкцию о том, что некоторая dll должна быть загружена, когда программа будет загружена. Это реализовано за вас компоновщиком.

Теперь вы можете решить, какой из этих двух вы собираетесь использовать. У DLL есть много преимуществ и недостатков. При разработке огромного приложения, возможно, стоит подумать об использовании DLL с отложенной загрузкой вместо статических библиотек. Некоторые библиотеки просто доставляются вам как библиотеки DLL, и у вас нет выбора. В любом случае, самый простой способ для новичка - использовать статические библиотеки. Это упростит развертывание и тестирование, поскольку при работе с DLL вы должны убедиться, что они обнаруживаются во время выполнения (даже при использовании отладчика), это включает в себя либо копирование всего в один каталог, либо работу с переменными пути.

Обычно это поставщик DLL (если предполагается, что вы должны иметь возможность работать с библиотекой) предоставляет вам файл (ы) заголовка и .lib, который содержит вызовы желаемой DLL. Некоторые поставщики (например, boost) требуют, чтобы вы включали только заголовочный файл, и библиотека автоматически связывается с вашим исполняемым файлом (это можно сделать с помощью директивы prorietary pragma компилятора). Если это не так, вы должны войти в настройки проекта C ++ (свойства проекта / Свойства конфигурации / Компоновщик / Вход) и ввести имя файла библиотеки в строку «Дополнительные зависимости», например iced.lib iceutild .lib . Вы также можете указать здесь полные имена путей. Имейте в виду, что вы должны ввести имена файлов lib для обеих конфигураций (Debug, Release). Это процедура, которую вы делаете в равной степени со статическими библиотеками и Dll. Единственная разница в том, что DLL требует, чтобы библиотека DLL находилась либо в вашем каталоге приложений, либо в одном из каталогов пути.

После этого шага вы все равно можете получить ошибки компилятора, если попытаетесь связать несовместимые библиотеки. Есть много причин, по которым они могут быть несовместимы. Но попробуйте сначала связать библиотеку таким образом и посмотреть, работает ли. Если нет, снова опубликуйте здесь свои ошибки;)

Включаемые файлы используются (используются) для включения в те места, где вы хотели бы использовать что-л. из библиотеки. Просто включите его, и компилятор будет знать, что символы должны поступать либо из другого (скомпилированного) модуля компиляции (скомпилированный cpp-file => объектный файл), либо из .lib. Ованес

PS Поначалу это может быть сложно, но когда вы привыкнете, это будет легко.

9
ответ дан 1 December 2019 в 07:19
поделиться

The first thing you need to do is to #include the header file that describes the functions that are available in that library.

The actual code for the library will be in one of 2 places:

  1. A static library (.lib)
  2. A dll (.dll)

Depending on how the library's code is given to you (as .lib files, or as a .dll), you'll have to either:

  • #pragma comment( lib, "libraryname.lib" ) if its a .lib
  • LoadLibrary if its a .dll

Sometimes a package comes with BOTH a .lib file that you need to link to, and a .dll file. In this case you don't need to call LoadLibrary, you only need to #pragma comment( lib, "libaryfile.lib" ) because in this case the .lib links you into the .dll.

A very important detail is to put the DLL where your application can find it. Charles Petzold says:

When Windows needs to load a DLL module before running a program that requires it, the library file must be stored in the directory containing the .EXE program, the current directory, the Windows system directory, the Windows directory, or a directory accessible through the PATH string in the MS-DOS environment. (The directories are searched in that order.) Окна программирования, 5-е изд. MSDN

Я не рекомендую использовать меню свойств проекта для связывания, потому что не так хорошо видно, какие библиотеки вы связываете.

См. Также

0
ответ дан 1 December 2019 в 07:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: