How to use c++ 20 modules in shared libraries ?

Michael Brunner 20 Reputation points
2024-05-10T19:22:17.17+00:00

Hello everyone,

I am currently working on a test-project where I want to use shared libraries and I would like to leverage the new C++20 modules feature. However, I am having some difficulty understanding how to properly set up my code to use C++20 modules between these shared libraries.

I have already set my compiler to use the C++20 standard, but I am unsure of the changes I need to make in my code and build system to use modules with shared libraries.

// test.modules.ixx

export module test.modules;

export void myFunction();

export class Test
{
public:
  Test();
};
// test.modules.cpp

module;

#include <iostream>

module test.modules;


void myFunction()
{
  std::cout << "hello from module";
}

Test::Test()
{
  std::cout << "init";
}

Command line options

/JMC /experimental:module /permissive- /ifcOutput "x64\Debug\" /GS /W3 /Zc:wchar_t /ZI /Gm- /Od /sdl /Fd"x64\Debug\vc143.pdb" /Zc:inline /fp:precise /D "_DEBUG" /D "TESTLIB_EXPORTS" /D "_WINDOWS" /D "_USRDLL" /D "MATHLIBRARY_EXPORTS" /D "_WINDLL" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /MDd /std:c++latest /FC /Fa"x64\Debug\" /EHsc /nologo /Fo"x64\Debug\" /Fp"x64\Debug\testLib.pch" /diagnostics:column 

When importing this into another project i get following errors:

// My Executable
import test.modules;

int main()
{
    std::cout << "Hello World!\n";
    myFunction();
    Test();
}
error C2230: could not find module 'test.modules'
error C3861: 'myFunction': identifier not found
error C3861: 'Test': identifier not found

enter image description here

Here are some specific questions I have:

  1. How should I structure my code to define and import modules in different shared libraries?
  2. Are there any specific compiler flags I need to use to enable modules?
  3. Are there any known issues or limitations I should be aware of when using C++20 modules with shared libraries?

Any examples, resources, or advice would be greatly appreciated. Thank you in advance for your help!

Thanks

C++
C++
A high-level, general-purpose programming language, created as an extension of the C programming language, that has object-oriented, generic, and functional features in addition to facilities for low-level memory manipulation.
3,561 questions
{count} votes

Accepted answer
  1. Minxin Yu 10,361 Reputation points Microsoft Vendor
    2024-05-13T02:15:31.14+00:00

    Hi, Michael Brunner

    If module is used in DLL, you need to use _declspec(dllexport) to export the symbol.

    1. In module.ixx:
    export _declspec(dllexport) void myFunction();
    export  class _declspec(dllexport) Test
    {
    ......
    }
    
    1. After building the DLL, find the test.modules.ifc file (By default, it is in the same directory as the project's obj file).
    2. In console project:

    Project properties -> C++ -> Command Line opition -> Add /reference "path to DLL project\x64\Debug\test.modules.ifc"

    1. In addition, add #include<iostream> in console project.

    Best regards,

    Minxin Yu


    If the answer is the right solution, please click "Accept Answer" and kindly upvote it. If you have extra questions about this answer, please click "Comment".

    Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread.

    1 person found this answer helpful.

0 additional answers

Sort by: Most helpful