Reputation: 35
I am trying out a simple test DLL project. Under my solution, I have two projects - first C++ Dll (library) and second C++ exe (driver). Below I've attached a snapshot of the basic project setup:
dllmain.h
#ifndef DLLMAIN_H_
#define DLLMAIN_H_
#ifdef FFMPEGLIB_EXPORTS
#define FFMPEGLIB_API __declspec(dllexport)
#else
#define FFMPEGLIB_API __declspec(dllimport)
#endif // FFMPEGLIB_EXPORTS
static void TestFoo();
extern "C" FFMPEGLIB_API void Test(int* num);
extern "C" FFMPEGLIB_API void ProxyFoo();
#endif
dllmain.cpp
#include "dllmain.h"
#include "A.h"
void TestFoo()
{
A a;
a.foo();
}
void Test(int* num)
{
*num = *num + 1;
}
void ProxyFoo()
{
TestFoo();
}
driver.cpp
#include <iostream>
#include "dllmain.h"
int main(int argc, char** argv)
{
int mum = 4;
Test(&num);
std::cout << num;
ProxyFoo();
return 0;
}
The library project compiles normally, but the exe fails to compile with a linker error:
Code Description Project File
LNK2001 unresolved extern symbol _imp_ProxyFoo driver driver.obj
LNK2001 unresolved extern symbol _imp_Test driver driver.obj
LNK1120 2 unresolved externals driver driver.exe
I have two questions here:
Why does the function name of dllmain.h
get mangled in spite of being marked as extern "C"
?
Why can I not create an instance of test class A
from extern
methods? What would be a good way of doing that?
Upvotes: 1
Views: 724
Reputation: 3763
Why the function name of dllmain.h getting mangled in spite being marked as extern "C"?
Because __declspec(dllimport)
.
Why can I not create instance of test class A from extern methods? What would be good way of doing it?
I think that's fine, but you didn't provide any class A
code. Just do this:
class __declspec(dllexport) A
{
/* ... */
};
Why EXE compile failed?
This is because you have not imported the LIB file of the DLL into the project.
There are two ways to import it:
#program comment(lib, "<YOUR_LIB_FILE>.lib")
to the code file.<YOUR_LIB_FILE>.lib
to Properties -> Linker -> Input -> Additional Dependencies.Microsoft documentation: https://learn.microsoft.com/en-us/cpp/build/importing-and-exporting
Upvotes: 2
Reputation: 104539
You need to put the extern "C"
thing around your function definitions that you intend to export in dllmain.cpp
so it matches the linkage of your declaration.
Also, you need to do the declexport
thing too.
extern "C"
{
__declspec(dllexport) void Test(int* num)
{
*num = *num + 1;
}
__declspec(dllexport) void ProxyFoo()
{
TestFoo();
}
}
Upvotes: -1