#c #dll #static
#c #dll #статический
Вопрос:
Я пытаюсь создать свою собственную библиотеку DLL, а затем заставить другой проект загружать ее статически. Мой файл DLL содержит как файл заголовка (называемый HelloFunc.h), так и:
#include <stdio.h>
extern "C"
{
_declspec(dllexport) void HelloFromDll();
}
И файл c (называемый HelloFunc.cpp ):
#include <stdio.h>
extern "C"
{
_declspec(dllexport) void HelloFromDll()
{
printf("Hello DLL. n");
}
}
После сборки проекта была создана библиотека объектных файлов (.lib).
Затем в моем другом проекте я попытался связать с ней статически.
В компоновщике -> Ввод -> Дополнительные зависимости я добавил свою библиотеку (я поместил ее в каталог моего нового проекта), а затем в компоновщике -> Ввод -> Командная строка я увидел, что она действительно связана с ней.
Однако, когда я попытался вызвать функцию HelloFromDll () в моем новом коде, ошибка говорит о том, что она не идентифицирована. Обратите внимание, что я также включил «HelloFunc.h», но ошибка говорит о том, что исходный файл не удалось открыть.
Я немного потерялся и не знаю, что я сделал не так. Любая помощь будет оценена 🙂
Ответ №1:
-
Вы должны указать
__declspec(dllimport)
вместо__declspec(dllexport)
при импорте библиотеки. -
Какое именно сообщение об ошибке вы получили?
[Отредактировано]
-
При компиляции библиотеки DLL вы указываете
__declspec(dllexport)
. Когда вы компилируете приложение, которое импортирует библиотеку DLL, вы указываете__declspec(dllimport)
. -
Проблема в том, что компилятор не может найти HelloFunc.h: Просто скопируйте HelloFunc.h в каталог вашего нового проекта.
Комментарии:
1. 1. Где я должен это указать? В моей DLL я указал __declspec(dllexport), должен ли я изменить его на __declspec (dllimport)? (Это кажется неправильным, потому что я экспортирую эту библиотеку). Должен ли я использовать __declspec (dllimport) где-нибудь в моем клиенте?
2. 2. Мои ошибки: — Ошибка 1 ошибка C1083: не удается открыть включаемый файл: ‘HelloFunc.h’: нет такого файла или каталога C:UsersMedocumentsvisual studio 2010 Projects StaticLoading StaticLoadingStaticLoading.c 2 — 2 IntelliSense: не удается открыть исходный файл «HelloFunc.h» c:usersMedocumentsvisual studio 2010 projects staticloadingstaticloadingstaticloading.c 2 — 3 IntelliSense: идентификатор «HelloFromDll» не определен c:usersMedocumentsvisual studio 2010 projects staticloadingstaticloadingstaticloading.c 6
3. @user3497668 Пожалуйста, не задавайте вопрос в комментариях к ответу. Подробные сообщения об ошибках должны быть в вопросе
Ответ №2:
Убедитесь, что ваш клиент и библиотека были скомпилированы в одном и том же режиме (debug или release). Это обычное узкое место.
Комментарии:
1. К сожалению, нет, библиотека скомпилирована в release, и я не могу скомпилировать клиент из-за ошибок. Похоже, я неправильно связал библиотеку, хотя она распознает in в командной строке, поэтому я не могу указать на проблему.