[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:
- 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;
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
8 replies
You can also try depends
Depends [dependencywalker.com]
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.
You must log in to post a reply. Not a member yet? Register here!



