2015-08-07 2 views
0

Как обычно я использую серию классов, я хочу сделать их как библиотеку ссылок, чтобы я мог легко их использовать.
Что я делаю, так это то, что я создаю два файла ссылок с визуальной студией 2013: a.lib и a.dll.
На мой взгляд, мне просто нужно использовать один из них, что означает, что мне не нужно использовать их вместе. К моему удивлению, если я импортирую a.lib (без a.dll) в новый проект, все будет хорошо. Но если я импортировать a.dll (без a.lib), я получаю много ошибок LNK 2001. Вот один из них:
Файл lib работает, но файл dll не

Error 150 error LNK2001: unresolved external symbol "public: __thiscall ExceptionAlertToLog::ExceptionAlertToLog(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,int,char const *)" ([email protected]@[email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]) C:\Users\Thomas\Documents\bloomberg-api\MarketDataAgent\MarketDataAgent\DialogSubsBlp.obj MarketDataAgent 

кажется, что я не могу использовать этот dll файл, я могу использовать только этот файл lib.

+0

Вы видели [эту статью] (https://msdn.microsoft.com/en-us/library/f6xx1b1z.aspx)? Это может помочь вам. Также убедитесь, что DLL находится в той же папке, что и EXE, упрощает ее;) (Чтобы автоматизировать это, вы можете выбрать какой-либо параметр, например «копировать» в информации компилятора, когда вы нажимали на DLL в своем проекте) – Xyv

+0

Вам нужно связать файл .lib и поместить DLL в исполняемую папку (или в системный путь). – Banex

+0

@Banex Я так сделал. – Yves

ответ

2

На мой взгляд, мне просто нужно использовать один из них, что означает, что мне не нужно использовать их вместе.

Ваше мнение не соответствует действительности.

В принципе, вы можете создавать библиотеки двух типов: статические (.lib) и динамические (.dll). Однако .lib файл, как правило, производится в обеих случаях:

1. В случае статической библиотеки, .lib файла просто состав .obj файлов, содержащее определение всех общественных типов и символов. Он связан с выходом .lib/.dll/.exe.

2. Динамические библиотеки выпускаются с так называемым import library. Он содержит информацию о размещении символов внутри DLL, но не фактическое содержание. Он загружается во время выполнения из файла .dll.

также:

неявно ссылаются на DLL, исполняемые файлы должны получить следующую от поставщика в DLL:

  • заголовочный файл, (.h-файл), содержащий заявления экспортируемых функций и/или классов C++. Классы, функции и данные должны иметь . У всех есть __declspec (dllimport), для получения дополнительной информации см. Dllexport, dllimport.

  • Библиотека импорта (файлы .LIB) для связи. (Компоновщик создает библиотеку импорта, когда DLL построена.)

  • Фактический DLL (DLL-файл).

Источник: MSDN.

Но если я импортирую a.dll (без.lib)

Окончательный вывод из вышесказанного заключается в том, что вы не можете этого сделать. a.lib Используется для ссылок на a.dll. Они связаны друг с другом и не могут использоваться отдельно. Файл .lib также может быть заменен файлом экспорта. Вы действительно должны прочитать this article.

+0

Если я отлаживаю проект с некоторыми библиотеками ссылок, я должен предоставить файлы 'lib' и' dll' вместе. Если я запускаю 'exe', мне просто нужно убедиться, что там есть файлы' dll'. Я прав? – Yves

+0

Нет, '.lib' требуется только на этапе компоновки. Во время выполнения должен присутствовать только файл .dll. Отладочная информация - совершенно другая вещь и хранится в файле «PDB». Его генерация управляется «Свойствами проекта» -> 'Linker' ->' Debugging' (в случае Visual Studio). –

+0

Большое спасибо. Теперь я понимаю. У меня остался только один вопрос. Когда я создаю некоторые файлы ссылок (с vs2013), например, есть одна функция, которую я хочу сделать ее библиотекой ссылок. Я создаю проект win32 и выбираю DLL, а затем добавляю в него файл главы и файл cpp этой функции. Наконец, постройте его, и я могу получить ТОЛЬКО файл 'dll', нет файла' lib'. Затем я меняю «тип конфигурации» этого проекта на «.lib». Перестройте, и я получаю ТОЛЬКО файл 'lib'. В этом случае я обнаружил, что могу использовать этот файл 'lib' без файла' dll'. Поэтому я думаю, что этот файл 'lib' равен – Yves

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