使用 C++ 20 模块创建共享库
Use C++ 20 modules to make shared libs
我正在寻找 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
目录中,但是,引用您发布的 link(强调他们的):
The CMI is not a distributable artifact. Think of it as a cache, that can be recreated as needed.
(其中 CMI 代表编译模块接口,对应于您的 gcm
文件。)所以我想您不应该那样做。一方面,您的 link 声明它可能包含绝对路径(通常是通过您的包含路径包含模块接口引用的文件),这听起来像是一个麻烦的秘诀。此外,这些文件不能跨不同的编译器(甚至可能是编译器版本)移植。
因此,解决方案似乎是提供您的模块接口文件和您的库,并告诉您的用户在尝试执行任何其他操作之前重新编译它们。您可以在 readme
文件中告诉他们如何操作。
我正在寻找 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
目录中,但是,引用您发布的 link(强调他们的):
The CMI is not a distributable artifact. Think of it as a cache, that can be recreated as needed.
(其中 CMI 代表编译模块接口,对应于您的 gcm
文件。)所以我想您不应该那样做。一方面,您的 link 声明它可能包含绝对路径(通常是通过您的包含路径包含模块接口引用的文件),这听起来像是一个麻烦的秘诀。此外,这些文件不能跨不同的编译器(甚至可能是编译器版本)移植。
因此,解决方案似乎是提供您的模块接口文件和您的库,并告诉您的用户在尝试执行任何其他操作之前重新编译它们。您可以在 readme
文件中告诉他们如何操作。