使用 C++ 20 模块制作共享库

问题描述 投票:0回答:2

我正在寻找 C++20 模块,我想问如何使用模块创建共享库。

所有示例(我发现)都在同一目录(lib + main)中工作,因此编译时间没有问题。

但是如果我想制作一个 .so 文件,并将其导入到另一个目录中的另一个程序中。

g++ 给我(我已经使用了该代码https://gcc.gnu.org/wiki/cxx-modules#Example)和该命令:

g++-11 -std=c++20 -fmodules-ts main.cpp -o app -Xlinker libhello.so

In module imported at main.cpp:1:1:
hello: error: failed to read compiled module: No such file or directory
hello: note: compiled module file is 'gcm.cache/hello.gcm'
hello: note: imports must be built before being imported
hello: fatal error: returning to the gate for a mechanical issue

我也应该分享

hello.gcm
文件吗?也放进去
/usr/local/lib

c++ g++ c++20 c++-modules
2个回答
2
投票

嗯,错误消息告诉您编译器在哪里寻找该文件,但它肯定不是

/usr/local/lib
,所以这是行不通的。 我想您可以分发
gcm
文件并指示用户将其放入其项目的
gcm.cache
目录中,但是,引用您发布的链接(强调他们的链接):

CMI 不是可分发的工件。 将其视为缓存,可以根据需要重新创建。

(其中 CMI 代表编译模块接口,对应于您的

gcm
文件。)所以我想您不应该这样做。 一方面,您的链接声明它可能包含绝对路径(通常包括模块接口通过包含路径引用的文件),这听起来像是一个麻烦的秘诀。 此外,这些文件不可跨不同编译器(甚至可能是编译器版本)移植。

因此,解决方案似乎是提供模块接口文件和库,并告诉用户在尝试执行其他操作之前重新编译它们。 您可以在您的

readme
文件中告诉他们如何操作。


0
投票

看起来名为 hello 的模块没有首先编译。 我的意思是,您应该首先使用类似的编译器命令对其进行编译,然后再编译 main。 很多时间过去了,但你如何处理这个问题很有趣:)

© www.soinside.com 2019 - 2024. All rights reserved.