uzer
uzer

Reputation: 35

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?

Upvotes: 1

Views: 724

Answers (2)

Sprite
Sprite

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:

  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

Upvotes: 2

selbie
selbie

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

Related Questions