2009-07-14 3 views
13

Я новичок в C++ и есть то, чего я просто полностью не получаю. В C#, если я хочу использовать внешнюю библиотеку, например log4net, я просто добавляю ссылку на DLL log4net, и ее члены автоматически доступны мне (и в IntelliSense). Как это сделать в не управляемом C++?Как «добавить ссылку» в C++

ответ

23

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

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

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

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

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

+0

Более тщательный, чем мой ответ. Я также добавил бы, что если вы используете LoadLibrary, вы не можете просто вызывать функции по имени. Вам нужно сделать позднюю привязку. –

+1

Я вижу, что снова неполна. LoadLibrary возвращает дескриптор, который вы можете передать GetProcAddress, который дает вам реальный указатель. Вы также можете позвонить в FreeLibrary, чтобы выгрузить его. (Я пошел вперед и удалил свой первоначальный ответ.) –

+0

@Steven: Правда, я подумал, что если ему нужно использовать LoadLibrary, я бы просто дал ему отправную точку, не увязнув в (много) подробных подробностях. – jalf

0

Первое, что вам нужно сделать, - это включить # заголовочный файл, описывающий функции, доступные в этой библиотеке.

Фактический код библиотеки будет находиться в одном из 2 мест:

  1. Статическая библиотека (.lib)
  2. DLL (.dll)

В зависимости от того, как код библиотеки дается вам (как .lib файлов, или как .dll), вам придется либо:

  • #pragma комментарий (ОМТ «libraryname.lib»), если сво .lib
  • LoadLibrary если сво .dll

Иногда пакет приходит с ОБОИХ в .lib файл, который нужно связать с, и .dll файл. В этом случае вам не нужно вызывать LoadLibrary, вам нужно только #pragma comment (lib, «libaryfile.lib»), потому что в этом случае .lib связывает вас с DLL.

Очень важная деталь - разместить DLL, где ваше приложение может ее найти. Чарльз Петцольд говорит:

Когда Windows необходимо загрузить DLL-модуль перед запуском программы, которая его требует, файл библиотеки должен быть сохранен в каталоге, содержащем программу .EXE, текущий каталог, системный каталог Windows, Каталог Windows или каталог, доступный через строку PATH в среде MS-DOS. (Директории ищутся в таком порядке.) Programming windows, 5th ed MSDN

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

See also

+0

Это не отвечает на вопрос. –

+0

Это ответ на вопрос сейчас, но не правильно. Как указывалось jalf, вы обычно связываетесь с lib lib (используя прагму или иным образом добавляя ее в командную строку, с которой работает lib.exe). Использование LoadLibrary является позднейшей альтернативой. –

4

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

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

9

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

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

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

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

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

Good Luck,
Ованес

P.S. Это может быть трудно в начале, но когда вы привыкнете к нему, это будет легко.

Смежные вопросы