如何使用包含 C++20 模块的静态库
How to use static library that contains C++20 modules
我有一个包含以下模块的静态库项目UserInterface
:
// Foo.ixx
export module Foo;
export void MyFunc();
void MyFunc()
{
[]() {};
}
模块 Foo
像这样导入到库的主 header 中:
// NuiLibrary.hpp
#pragma once
import Foo;
// Windows
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
// other includes
我无法构建解决方案,我可以构建静态库,但在我引用该库的 Sculpt
项目中,我收到以下错误:
经过大量搜索,我认为这是因为需要通过设置 Additional Module Dependencies
将模块显式包含在客户端解决方案中。
它的语法是什么?
尽管设置了这个,为什么它不能正常工作:
原因是什么?
经过一天的尝试后,我的具体问题是 Microsoft Package Server 文件锁定 .ifc
文件导致 could not find module
错误。
如何检测?
您可以通过右键单击模块 -> Compile
尝试自行编译模块来确定是否存在此问题。然后它将无法编译文件并出现错误 could not open the file another process is using it
.
(非)解决方案
一气之下,我只是在我的静态库项目设置中将所有内容设置为默认值,现在它可以正常工作了。
这肯定是什么原因造成的
配置解决方案时,您必须执行以下操作:
- 在客户端项目中添加对静态库项目的引用(这将消除客户端项目的错误)
- 在静态库中转到
Project Settings
->C/C++
->General
并勾选 Scan sources for module dependencies
(这将消除库项目中的错误)
其他问题
在 Visual Studio 2019 的旧版本中,当您将文件从 .hpp
重命名为 .ixx
时,编译器仍会将文件识别为头文件。
要解决此问题,请转到文件属性并将 Item type
设置为 C/C++ compiler
而不是 C/C++ header
.
在Visual Studio 2019的当前版本中,当您创建模块文件时,您需要转到文件属性C/C++
->Precompiled headers
->Precompiled Header
并单击Not using precompiled header
。
这将修复以下讨厌的错误:
虽然我对 Visual Studio 中的模块没有任何经验,但我仍然能看到一些奇怪的东西。
Header 文件不应与我们在您的 NuLibrary.hpp
文件中看到的模块一起使用。虽然语法看起来没问题,但如果 header 包含在声明模块的其他源文件的全局模块片段 (GMF) 中,则会出现问题,因为导入声明可能不会出现在 GMF 中:
// some source file including your header
module;
#include "NuLibrary.hpp" // --> ERROR! import declaration..
我建议完全忘记拥有模块项目的“main header”的想法,而是将所有功能放在项目的模块接口文件中:
// NuLibrary.cpp
module;
// Windows
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
// other includes
export module nulibrary;
import Foo;
[...]
我想 Visual Studio 如果你有那个文件 .ixx
-extension..
我有一个包含以下模块的静态库项目UserInterface
:
// Foo.ixx
export module Foo;
export void MyFunc();
void MyFunc()
{
[]() {};
}
模块 Foo
像这样导入到库的主 header 中:
// NuiLibrary.hpp
#pragma once
import Foo;
// Windows
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
// other includes
我无法构建解决方案,我可以构建静态库,但在我引用该库的 Sculpt
项目中,我收到以下错误:
经过大量搜索,我认为这是因为需要通过设置 Additional Module Dependencies
将模块显式包含在客户端解决方案中。
它的语法是什么?
尽管设置了这个,为什么它不能正常工作:
原因是什么?
经过一天的尝试后,我的具体问题是 Microsoft Package Server 文件锁定 .ifc
文件导致 could not find module
错误。
如何检测?
您可以通过右键单击模块 -> Compile
尝试自行编译模块来确定是否存在此问题。然后它将无法编译文件并出现错误 could not open the file another process is using it
.
(非)解决方案
一气之下,我只是在我的静态库项目设置中将所有内容设置为默认值,现在它可以正常工作了。
这肯定是什么原因造成的
配置解决方案时,您必须执行以下操作:
- 在客户端项目中添加对静态库项目的引用(这将消除客户端项目的错误)
- 在静态库中转到
Project Settings
->C/C++
->General
并勾选Scan sources for module dependencies
(这将消除库项目中的错误)
其他问题
在 Visual Studio 2019 的旧版本中,当您将文件从 .hpp
重命名为 .ixx
时,编译器仍会将文件识别为头文件。
要解决此问题,请转到文件属性并将 Item type
设置为 C/C++ compiler
而不是 C/C++ header
.
在Visual Studio 2019的当前版本中,当您创建模块文件时,您需要转到文件属性C/C++
->Precompiled headers
->Precompiled Header
并单击Not using precompiled header
。
这将修复以下讨厌的错误:
虽然我对 Visual Studio 中的模块没有任何经验,但我仍然能看到一些奇怪的东西。
Header 文件不应与我们在您的 NuLibrary.hpp
文件中看到的模块一起使用。虽然语法看起来没问题,但如果 header 包含在声明模块的其他源文件的全局模块片段 (GMF) 中,则会出现问题,因为导入声明可能不会出现在 GMF 中:
// some source file including your header
module;
#include "NuLibrary.hpp" // --> ERROR! import declaration..
我建议完全忘记拥有模块项目的“main header”的想法,而是将所有功能放在项目的模块接口文件中:
// NuLibrary.cpp
module;
// Windows
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
// other includes
export module nulibrary;
import Foo;
[...]
我想 Visual Studio 如果你有那个文件 .ixx
-extension..