Хорошо, вот в чем дело. Пытаясь углубить свои знания API-интерфейсов C++, я попытался узнать больше о типах файлов библиотек. Я довольно хорошо разобрался со статическими библиотеками. Вы просто подключаете библиотеку к проекту, и ее содержимое помещается в двоичные файлы при компиляции и компоновке. Но я столкнулся с проблемой, когда начал пытаться использовать динамические библиотеки. Мне удалось успешно скомпилировать файл DLL с помощью функции __declspec и создать внешние блоки (чтобы его можно было успешно экспортировать в C++). Но проблема возникает, когда я пытаюсь связать файл. На основе нескольких руководств, которые я видел в Интернете, я создаю заголовок с предварительными определениями и включаю его в исполняемый проект. Затем я обязательно добавляю каталог поиска в настройки сборки проекта вместе с путем к импортируемой библиотеке. Затем, когда я иду собирать проект, он выдает ошибку компоновщика (я могу сказать, потому что объектный файл скомпилирован) «не удается найти -l [путь к файлу]». Будут ли сделаны дополнительные настройки? Я предполагаю, что это как-то связано с моим компилятором (MinGW), потому что Code::Blocks (в настоящее время я использую плагин Eclipse CDT) вызвал аналогичную ошибку ссылки.
Если вам нужно увидеть код, я предоставлю его ниже.
// EXE: main.cpp
#include <iostream>
#include "DLLTutorial.h"
int main()
{
Function();
std::cout << "1 + 3:\t" << Add(1, 3);
}
// DLL: DLLTutorial.cpp
#define DLL_EXPORT
#include <iostream>
#include "DLLTutorial.h"
extern "C"
{
DLLCOMP int Add(int a, int b)
{
return a + b;
};
DLLCOMP void Function(void)
{
std::cout << "DLL Called!\n";
};
};
// DLL: DLLTutorial.h
#ifndef DLLTUTORIAL_H_
#define DLLTUTORIAL_H_
#include <iostream>
#ifdef DLL_EXPORT
#define DLLCOMP __declspec(dllexport)
#else
#define DLLCOMP __declspec(dllimport)
#endif
extern "C"
{
DLLCOMP int Add(int a, int b);
DLLCOMP void Function(void);
};
#endif /* DLLTUTORIAL_H_ */
Это просто очень простой пример кода, который я использовал с веб-сайта. Я не могу правильно связать исполняемый файл, поэтому я был бы признателен за любой совет, который можно было бы мне дать.
Кроме того, у меня есть связанный с этим вопрос. Прочитав несколько руководств в Интернете, некоторые упомянули, что функция __declspec специфична для Windows/Microsoft. Это правда? В таком случае, что было бы хорошим эквивалентом для использования в других операционных системах?