C ++ DLL не будет ссылаться? - PullRequest
4 голосов
/ 06 декабря 2010

Хорошо, вот проблема.Пытаясь расширить свои знания 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.Это правда?В каком случае, что было бы хорошим эквивалентом для использования в других операционных системах?

Ответы [ 2 ]

2 голосов
/ 06 декабря 2010

Когда вы создаете dll, вы также создаете корпоративный .lib-файл, 'implib'.Вы должны статически связать этот файл в вашем exe-файле.

РЕДАКТИРОВАТЬ: __cdeclspec (...) действительно Microsoft.Не знаю о других платформах.

0 голосов
/ 06 декабря 2010

Вы должны указать компилятору, где искать ваши библиотеки и включения. И в GCC, и в MinGW это достигается с помощью -I для включений и -L для библиотек. Я не думаю, что вам необходимо генерировать .lib (или .a, как это обычно бывает в * nix и GCC), GCC должен быть в состоянии найти вашу функцию в dll.

Например, собрать и связать общую библиотеку:

g++ -shared -olibmy_dll.dll my_dll.cpp

Затем, предполагая, что все файлы находятся в одном и том же каталоге, соберите и свяжите исполняемый файл и скажите GCC использовать вашу библиотеку:

g++ -oapp.exe app.cpp -lmy_dll -L.

Обратите внимание на разницу между -l и -L, один сообщает GCC, какие библиотеки использовать, а другой - где их искать. В Eclipse CDT вы найдете эти настройки в: Свойства проекта -> Сборка C / C ++ -> Настройки -> MinGW C ++ Linker -> Библиотеки.

Кроме того, __declspec распознается MinGW, но я думаю, что в любом случае это специфично для Microsoft.

...