c++dllname-mangling

C++ dll and name mangling issue


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:

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:

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:

  1. Why does the function name of dllmain.h get mangled in spite of being marked as extern "C"?

  2. Why can I not create an instance of test class A from extern methods? What would be a good way of doing that?


Solution

  • 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:

    1. Add #program comment(lib, "<YOUR_LIB_FILE>.lib") to the code file.
    2. Add <YOUR_LIB_FILE>.lib to Properties -> Linker -> Input -> Additional Dependencies.

    Microsoft documentation: https://learn.microsoft.com/en-us/cpp/build/importing-and-exporting