[SOLVED]Cannot resolve the symbols from a custom dll



  • Hello,
    I am very close to tear all my hairs out. I have been trying to resolve the functions from my custom dll but so far, no luck.

    Here is the template I use:

    @QLibrary library("E:/QT_works/myDll.dll");

    if(library.load())
    qDebug()<<"Loading done";

    typedef void (*MyPrototype)();
    MyPrototype myFunction = (MyPrototype) myLib.resolve("myFunction");
    if (myFunction)
    myFunction();@

    Loading is successful. However, symbols cannot be resolved.
    I used debugger and after the myLib.resolve step, the following error appears on the window where name and values are shown;

    bq. errorString "Cannot resolve symbol "myFunction" in E:/QT_works/myDll.dll: The specified procedure could not be found." QString

    I also used
    @HINSTANCE hDLLFeX;
    hDLLFeX=LoadLibrary(L"myDll.dll");
    if(hDLLFeX)
    qDebug()<<"LOAD SUCCESSFUL";

             MyPrototype myFunction = (MyPrototype)  GetProcAddress(hDLLFeX, "myFunction");@
    

    Both return a null pointer.
    It's obvious that I cannot find the function declared in the library source file, but I guess I used correct syntax when declaring my function. What I used was

    @extern "C" {
    ...
    void myFunction(int,int)

    }@

    It's good to mention that the same dll was used by someone else earlier in VS 6.0.

    I also downloaded DependencyWalker and check the names of the functions inside myDll.dll. I noticed something which seemed to be interesting. The name of the function which dependencywalker shows is _Z8myFunctionPd, _Z8 in front and Pd at the end of the function. I guess it shouldn't be a problem.
    I am not sure if I should resolve the symbols by the name shown in dependencywalker or the original name declared in extern "C".

    I am hoping someone might be able to help me.

    Thanks



  • Hi magpielover,

    I see no extort statement, so where do you export the function from the dll? Which compiler was used for creation of the dll?



  • I am using the below in the common API.h file.
    @#ifndef FEX_API_H
    #define FEX_API_H

    #ifdef WIN32
    #ifndef DLLEXPORT
    #define DLLEXPORT __declspec(dllexport)
    #endif
    #endif

    extern "C" {

    ...
    ....
    typedef int DLLEXPORT (MyPrototype )(double);

    }@



  • You could use nm or dumpbin to see if your symbols are exported correctly.



  • You can also try depends
    "Depends":http://dependencywalker.com/



  • with @ typedef int DLLEXPORT (MyPrototype )(double) @ you export a defined type (function pointer), not a real function.



  • you would need the following:

    @
    #ifndef FEX_API_H
    #define FEX_API_H

    #ifdef WIN32

    ifndef DLLEXPORT

    if CREATE_DLL

    define MYDLLAPI __declspec(dllexport)

    else

    define MYDLLAPI __declspec(dllimport)

    endif

    endif

    #endif

    extern "C" {
    ...
    void MYDLLAPI myFunction(int,int);

    }
    @

    CREATE_DLL would be a macro defined inside your dll project but nowhere else.



  • Hello,
    I used identifiers in Qlibrary template so sorry for the mistake I made. I have found the solution.
    I had directly converted the code from VS 6.0 so .def file is used to add the export directive to the object file. However, in the newer versions of compilers such as MinGW and VS 11, __declspec(dllexport) is used to add the export directive automatically. I just added declared the functions with __declspec(dllexport) keyword and problem is solved.

    This was enough.
    @#ifdef WIN32
    #ifdef FEX_CNBCDLL
    #define DLLEXPORT __declspec(dllexport)
    #else
    #define DLLEXPORT __declspec(dllimport)
    #endif
    #else
    #define DLLEXPORT
    #endif@

    Thank you all guys. I really appreciate the helpful comments.


  • Moderators

    Be sure and add [Solved] to the beginning of the thread title if the issue is solved. Thanks!


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.