C++ 模块是否在 GCC 中实现,以便我可以在模块中创建自定义异常以在另一个文件中使用?我通过 MinGW/MSYS 使用 GCC 14.2.0 时收到以下错误:
x86_64-w64-mingw32-gcc -std=c++23 -fmodules-ts -x c++-system-header -c cstdint variant exception
x86_64-w64-mingw32-gcc -std=c++23 -fmodules-ts -lstdc++ -x c++ -c error.cppm -o error.o
x86_64-w64-mingw32-gcc -std=c++23 -fmodules-ts error.o main.cpp -lstdc++ -static-libstdc++ -o test.exe
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/14.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\msys64\tmp\ccztFNJq.o:main.cpp:(.text+0x0): multiple definition of `Crash@Error::~Crash()'; error.o:error.cppm:(.text$_ZNW5Error5CrashD1Ev[_ZNW5Error5CrashD1Ev]+0x0): first defined here
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/14.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\msys64\tmp\ccztFNJq.o:main.cpp:(.text+0x2e): multiple definition of `Crash@Error::~Crash()'; error.o:error.cppm:(.text$_ZNW5Error5CrashD0Ev[_ZNW5Error5CrashD0Ev]+0x0): first defined here
collect2.exe: error: ld returned 1 exit status
如果我显式地为
Crash
创建默认或空的析构函数,错误不会改变。
异常是根据此文件创建的:
错误.cppm
export module Error;
import <cstdint>;
import <exception>;
export enum class ErrorCode: uint8_t {
INVALID,
PROBLEM1,
PROBLEM2,
};
export class Crash: public std::exception {
public:
Crash(ErrorCode crashCode) noexcept: code(crashCode) { }
private:
ErrorCode code;
};
我用来测试的主文件只是抛出异常。
主.cpp
import Error;
int main() {
throw Crash(ErrorCode::PROBLEM1);
}
这只是我还不能做的事情,还是我在代码中犯了根本性错误?难道是因为我没有把模块代码放到命名空间中?
您的代码看起来不错,并且正在 64 位 Debian 上使用 g++ 14.2 进行编译、链接和正常工作。
您的问题很可能是 MinGW/MSYS 特有的,您应该向他们报告错误。