我正在寻找 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
?
嗯,错误消息告诉您编译器在哪里寻找该文件,但它肯定不是
/usr/local/lib
,所以这是行不通的。 我想您可以分发 gcm
文件并指示用户将其放入其项目的 gcm.cache
目录中,但是,引用您发布的链接(强调他们的链接):
CMI 不是可分发的工件。 将其视为缓存,可以根据需要重新创建。
(其中 CMI 代表编译模块接口,对应于您的
gcm
文件。)所以我想您不应该这样做。 一方面,您的链接声明它可能包含绝对路径(通常包括模块接口通过包含路径引用的文件),这听起来像是一个麻烦的秘诀。 此外,这些文件不可跨不同编译器(甚至可能是编译器版本)移植。
因此,解决方案似乎是提供模块接口文件和库,并告诉用户在尝试执行其他操作之前重新编译它们。 您可以在您的
readme
文件中告诉他们如何操作。
看起来名为 hello 的模块没有首先编译。 我的意思是,您应该首先使用类似的编译器命令对其进行编译,然后再编译 main。 很多时间过去了,但你如何处理这个问题很有趣:)