2015-05-16 4 views
0

Я создаю DLL, который должен работать в качестве модуля (выполнения загрузки)
Он работает на Linux/Windows с dlopen и т.д ..
Это выглядит как:Визуальная 2015 Компиляция DLL

.cpp

std::string pomnoz(std::string &s, std::string &ds) 
{ 
    std::cout << s << " " << ds << std::endl; 
    return s.append(ds); 
} 

.h

#ifdef __cplusplus 
extern "C" 
{ 
#endif 
    std::string pomnoz(std::string &s, std::string &ds); 
#ifdef __cplusplus 
} 
#endif 

проблема заключается в том, когда я скомпилировать его с г ++ он генерирует ~ 480Kb .DLL, который работает с out на windows/linux (я передаю 2 строки и возвращает их).
Но я не могу использовать g ++ из-за c14, который я использую далее в библиотеке.
В окнах я использую VS2015, он создает 65kb .DLL, который не работает (он загружает, но возвращает null вместо funcptr).
Я попытаюсь удалить #ifdef __cplusplus
Но ничего не меняется.

Где проблема? Я должен переключить что-то в настройках сборки?

+0

проблема заключается в том вам нужно использовать ту же реализацию std :: string между различными модулями в вашей программе. в частности, если хост-программа была скомпилирована с g ++, тогда вы должны скомпилировать вашу dll с g ++. Или вы можете использовать простые строки C вместо C++ std :: string – dsi

+0

Не имеет значения с void() - та же проблема. – pszczelaszkov

ответ

0

Вы отсутствуете dllexport рядом с функцией pomnoz:

__declspec(dllexport) std::string pomnoz(std::string &s, std::string &ds); 

Затем в приложении вы можете динамически загрузить DLL и получить адрес для экспортируемой функции:

HMODULE lib = LoadLibrary(L"test.dll"); 

typedef std::string(*FNPTR)(std::string&, std::string&); 
FNPTR myfunc = (FNPTR)GetProcAddress(lib, "pomnoz"); 

if (!myfunc) 
    return 1; 

std::string a("a"); 
std::string b("b"); 

myfunc(a, b); 
+0

Спасибо, что попробовал, но столкнутся с g ++, поэтому мне нужно добавить что-то вроде ifdef visual? – pszczelaszkov

+0

Да, вам нужно: '#if defined (_MSC_VER)' – doqtor

Смежные вопросы