Wpis z mikrobloga

Witam ponownie #cpp w #windows ! ()

Pracujac sobie na Macu, bez problemu przeszlo mi:

extern "C" std::vector> exportedMethod() {
return std::vector>({std::make_shared()});
}

Jednakze pod windowsem dostaje komunikat o bledzie:

error C2526: 'exportedMethod': C linkage function cannot return C++ class 'std::vector,std::allocator>>'
Probowalem dorzucic declspec(dllexport), a extern "C" zmienilem na extern "C++". Niestety, pomimo zmian, metoda pobierajaca funkcje z dllki zwraca mi NULL:

HINSTANCE libraryHandle = LoadLibrary(filePath.c_str());
auto exportedMethod = (exportedMethodt_t)GetProcAddress(libraryHandle, "exportedMethod")

Czy mamy jakies rozwiazanie tego problemu? Nie udalo mi sie zbytnio nic wygooglowac niestety :(
  • 9
@zrakiep: Zobaczyłem szablony na granicy DLL i wygooglowałem pierwszą rzecz poniekąd związaną z tematem.

@CppPolska:
Problem najwyraźniej wygląda tak, że kompilator nie lubi klasy (C++) zmieszanej z extern "C". extern "C" używany jest przy kodzie głównie po to, żeby nie było typowego dla C++ manglingu nazwy funkcji przy tworzeniu symbolu i żeby się dało do tej funkcji odwołać z GetProcAddress na przykład, co próbujesz zrobić.
https://stackoverflow.com/questions/1041866/what-is-the-effect-of-extern-c-in-c

dlaczego msvc nie ogarnia
@CppPolska: Z drugiej strony doczytałem ten link opisujący .def co wkleiłem...

If you need to place the decorated names in the DEF file, you can obtain them by using the DUMPBIN tool or by using the linker /MAP option.

Tak na dobrą sprawę jak dostaniesz dekorowaną nazwę to możesz ją po prostu wkleić tam gdzie używasz GetProcAddress i pewnie wyjdzie na to samo.

Z takich innych sposobów na dobranie się do
Hej, maly update z mojej strony ( ͡° ͜ʖ ͡°)

Troche doedukowalem sie, faktycznie lepiej jest korzystac wylacznie z zestawu typow kompatybilnych z C - nie bawimy sie wtedy w roznice miedzy layoutem plikow .exe i .dll. Do tego nie bedziemy przywiazani do konkretnych kompilatorow (exec i dll moga wtedy byc kompilowane pod innymi kompilatorami - dobrze kminie?). Sam Core Guidelines tak zaleca, i brzmi to moim zdaniem