Здравствуйте!
Мне необходимо экспортировать функции (С++) в dll.
"Обычные" функции он экспортирует нормально, но если в функции используются контейнеры (string, map и др), то выдет дофига ошибок вида "undefined reference to …".
например: //alexbogo.narod.ru/1.JPG
кто знает как от этого избавиться?
я пользовался методом, который описан здесь: //ru.wikipedia.org/wiki/DLL
16 марта 2010 в 8:05
а путь к .a-файлу в список путей к подключаемым файлам прописали? а dll зарегистрировали или положили рядом с проектом?
16 марта 2010 в 6:05
>через LoadLibrary.
я так и делал, есть другой способ?
>туда, где .lib. не уверен, правда, что vs их поймет.
куда только можно добавлял, но эффекта нет
16 марта 2010 в 1:03
>> куда именно его прописать, в какое поле?
туда, где .lib. не уверен, правда, что vs их поймет.
>> как тогда использовать их в visual studio.
через LoadLibrary.
15 марта 2010 в 18:00
теперь разобрался в чем бага: я создавал dll с помощью Dev-cpp, а использовал в visual studio. Если использовать в Dev все норм.
Но как тогда использовать их в visual studio.
>скармливать линкеру – куда именно его прописать, в какое поле?
14 марта 2010 в 22:02
1. -L, -I и прочие определяют, где у вас лежат .a, .h и другие. почитать можно в инструкции к компилятору.
2. не читал, что там в википедии. может и подходит.
3. не в коем случае не #include: .a – это то же самое, что и .lib, то есть его надо скармливать линкеру.
4. можно, для этого используется другой подход – динамическое подключение библиотек (в win32 api для этого есть LoadLibrary, не знаю как с этим в mingw/gcc).
14 марта 2010 в 22:00
1)я никогда не занимался компилирование и тому подобным через командную строку, можете пояснить что значит -L, -I и всю теплая компания или где об этом можно почитать?
2)а то что в википедии не подходит, что там по другому должно быть?
3) т.е необходимо делать на подобии такого: #include "1.a" ?
можно ли как то по другому, если мне необходимо много dll-ок подключать и заранее не знаю какие именно?
14 марта 2010 в 21:02
>>подключать, когда нужно прилинковать библиотеку на этапе компиляции.
как это сделать программно?
>>прочитайте, под каким именем экспортируется ваш AddNumbers. наверняка ведь что-нибудь вроде AddNumbers@4xyz. в языке си этой гадости еще не было
в dll там без всякой гадости…
можете скинуть код правильного импорта?
14 марта 2010 в 21:02
1. просто -lимя_библиотеки (не забудьте -L, -I и всю теплую компанию).
2. не могу – я без компиляторов, так что mingw у меня отсутствует )
странно, что у вас вообще компилируется, если вы не знаете, как как подключить к проекту вашу динамическую библиотеку.
14 марта 2010 в 19:00
>> не понял как использовать файл .a?
подключать, когда нужно прилинковать библиотеку на этапе компиляции.
>> когда вызываем функцию – вылетает ошибка.
прочитайте, под каким именем экспортируется ваш AddNumbers. наверняка ведь что-нибудь вроде AddNumbers@4xyz. в языке си этой гадости еще не было.
14 марта 2010 в 16:00
для с и с++ разный синтаксис экспорта.
14 марта 2010 в 15:05
Леонид maxleo Максимов,
теперь dll создается, но так и не понял как использовать файл .a?
для данного примера все работает, но если у функции как параметр – контейнер, то после импорта, когда вызываем функцию – вылетает ошибка.
Импорт делаю как в википедии.
Пример функции:
DLLEXPORT double AddNumbers(std::string str)
{
std::cout << str;
return 3.14;
}
13 марта 2010 в 21:00
странно, что вы в гугле плохо искали: //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 марта 2010 в 20:04
Леонид maxleo Максимов,
я сам понимаю, что ему не хватает файлов, но каких именно так и не постиг.
На сколько понимаю ему нужна библиотека данного контейнера, который я использую, но как это сделать и какой именно файл нужен?
13 марта 2010 в 20:03
скорее всего кроме вашего объектника вам нужно подключить и объектники с реализацией использованного (или прилинковываемые части соответствующих динамических библиотек).
13 марта 2010 в 19:03
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
13 марта 2010 в 19:01
Код бы глянуть