singlepost

экспорт функций в dll (C++) << На главную или назад  

Здравствуйте!
Мне необходимо экспортировать функции (С++) в dll.
"Обычные" функции он экспортирует нормально, но если в функции используются контейнеры (string, map и др), то выдет дофига ошибок вида "undefined reference to …".
например: //alexbogo.narod.ru/1.JPG

кто знает как от этого избавиться?

я пользовался методом, который описан здесь: //ru.wikipedia.org/wiki/DLL

77 ответов в теме “экспорт функций в dll (C++)”

  1. 16
    Леонид Максимов ответил:

    а путь к .a-файлу в список путей к подключаемым файлам прописали? а dll зарегистрировали или положили рядом с проектом?

  2. 15
    Алексей Боголюбский ответил:

    >через LoadLibrary.
    я так и делал, есть другой способ?

    >туда, где .lib. не уверен, правда, что vs их поймет.
    куда только можно добавлял, но эффекта нет

  3. 14
    Леонид Максимов ответил:

    >> куда именно его прописать, в какое поле?
    туда, где .lib. не уверен, правда, что vs их поймет.

    >> как тогда использовать их в visual studio.
    через LoadLibrary.

  4. 13
    Алексей Боголюбский ответил:

    теперь разобрался в чем бага: я создавал dll с помощью Dev-cpp, а использовал в visual studio. Если использовать в Dev все норм.
    Но как тогда использовать их в visual studio.
    >скармливать линкеру – куда именно его прописать, в какое поле?

  5. 12
    Леонид Максимов ответил:

    1. -L, -I и прочие определяют, где у вас лежат .a, .h и другие. почитать можно в инструкции к компилятору.
    2. не читал, что там в википедии. может и подходит.
    3. не в коем случае не #include: .a – это то же самое, что и .lib, то есть его надо скармливать линкеру.
    4. можно, для этого используется другой подход – динамическое подключение библиотек (в win32 api для этого есть LoadLibrary, не знаю как с этим в mingw/gcc).

  6. 11
    Алексей Боголюбский ответил:

    1)я никогда не занимался компилирование и тому подобным через командную строку, можете пояснить что значит -L, -I и всю теплая компания или где об этом можно почитать?
    2)а то что в википедии не подходит, что там по другому должно быть?

    3) т.е необходимо делать на подобии такого: #include "1.a" ?
    можно ли как то по другому, если мне необходимо много dll-ок подключать и заранее не знаю какие именно?

  7. 10
    Алексей Боголюбский ответил:

    >>подключать, когда нужно прилинковать библиотеку на этапе компиляции.

    как это сделать программно?

    >>прочитайте, под каким именем экспортируется ваш AddNumbers. наверняка ведь что-нибудь вроде AddNumbers@4xyz. в языке си этой гадости еще не было

    в dll там без всякой гадости…

    можете скинуть код правильного импорта?

  8. 9
    Леонид Максимов ответил:

    1. просто -lимя_библиотеки (не забудьте -L, -I и всю теплую компанию).
    2. не могу – я без компиляторов, так что mingw у меня отсутствует :) )

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

  9. 8
    Леонид Максимов ответил:

    >> не понял как использовать файл .a?

    подключать, когда нужно прилинковать библиотеку на этапе компиляции.

    >> когда вызываем функцию – вылетает ошибка.

    прочитайте, под каким именем экспортируется ваш AddNumbers. наверняка ведь что-нибудь вроде AddNumbers@4xyz. в языке си этой гадости еще не было.

  10. 7
    Вымышленнов Кузя ответил:

    для с и с++ разный синтаксис экспорта.

  11. 6
    Алексей Боголюбский ответил:

    Леонид maxleo Максимов,
    теперь dll создается, но так и не понял как использовать файл .a?
    для данного примера все работает, но если у функции как параметр – контейнер, то после импорта, когда вызываем функцию – вылетает ошибка.
    Импорт делаю как в википедии.
    Пример функции:
    DLLEXPORT double AddNumbers(std::string str)
    {
    std::cout << str;
    return 3.14;
    }

  12. 5
    Леонид Максимов ответил:

    странно, что вы в гугле плохо искали: //www.mingw.org/wiki/sampleDLL

    Building the DLL

    To build the DLL use the following commands:

    g++ -c -DBUILDING_EXAMPLE_DLL example_dll.cpp
    g++ -shared -o example_dll.dll example_dll.o -Wl,–out-implib,libexample_dll.a


    The "-shared" option tells the linker to create a DLL instead of an .exe, and the "–out-implib" linker option causes an import library to be created, which is used later on.

    соответственно, говорите -lm, и т.п.

  13. 4
    Алексей Боголюбский ответил:

    Леонид maxleo Максимов,
    я сам понимаю, что ему не хватает файлов, но каких именно так и не постиг.
    На сколько понимаю ему нужна библиотека данного контейнера, который я использую, но как это сделать и какой именно файл нужен?

  14. 3
    Леонид Максимов ответил:

    скорее всего кроме вашего объектника вам нужно подключить и объектники с реализацией использованного (или прилинковываемые части соответствующих динамических библиотек).

  15. 2
    Алексей Боголюбский ответил:

    1)исходник откуда берем ф-ию
    //alexbogo.narod.ru/module.cpp
    2)создаем файл .o
    g++ -c module.cpp -o module.o -DBUILDING_DLL=1
    3) создаем dll
    dllwrap module.o -o res.dll

    это все есть здесь: //ru.wikipedia.org/wiki/DLL

  16. 1
    Евгений Гаврин ответил:

    Код бы глянуть

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.