오류 : 컴파일 된 모듈을 읽지 못했습니다. 해당 파일 또는 디렉토리가 없습니다.
방금 Beginning C ++ 20 (eBook 버전) 책을 구입했으며 새로운 C ++ 20 메서드를 사용하여 첫 번째 예제를 컴파일하려고합니다.
소스 파일의 내용은 다음과 같습니다.
// Ex1_01.cpp
// A Complete C++ program
import <iostream>;
int main()
{
int answer{42}; // Defines answer with 42
std::cout << "The answer to life, the universe, and everything is "
<< answer
<< std::endl;
return 0;
}
내가 올바르게 이해한다면 이것은 GCC 버전 10 또는 11에서 아직 지원되지 않습니다 (일부 사이트는 GCC 11이 지원한다고 주장하지만 일부 사이트에서 -fmodules-ts 플래그를 사용하면 구현 / 실험적 및 피장 장이 된.
몇 가지 검색 후 다음을 참조하는 게시물을 찾았습니다. https://gcc.gnu.org/wiki/cxx-modules 모듈 (-fmodules-ts 플래그 사용)을 지원하는 GCC 10 버전을 설치하는 지침이 있지만 예제 코드에서이를 사용하면 다음 오류가 발생합니다.
In module imported at Ex1_01.cpp:3:1:
/usr/local/include/c++/10.0.0/iostream: error: failed to read compiled module: No such file or directory
/usr/local/include/c++/10.0.0/iostream: note: compiled module file is ‘gcm.cache/./usr/local/include/c++/10.0.0/iostream.gcm’
/usr/local/include/c++/10.0.0/iostream: fatal error: jumping off the crazy train to crashville
compilation terminated.
gcc의 버전은 다음과 같습니다. g ++ (GCC) 10.0.0 20200110 (실험적) [svn-280157 : 20201220-1704] 여기 Stack Overflow에서 누군가이 버전을 가리키는 게시물을 찾았습니다 ( 모듈을 사용하여 C ++ 코드를 컴파일하는 방법 -ts 및 gcc (실험용)? )
또한 위키 (hello.cc 및 main.cc)의 예제를 시도했지만 오류 메시지도 표시됩니다.
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: fatal error: jumping off the crazy train to crashville
compilation terminated.
이 작업을 수행 할 수있는 방법이 있습니까? 아니면 모듈을 지원하는 GCC 11의 안정적인 릴리스가 나올 때까지 "이전"#include 메서드로 시작해야합니까? GCC 11의 최신 스냅 샷을 빌드하면 대부분의 다른 C ++ 20 특정 코드가 작동해야한다는 것을 알고 있습니다. (또는 내 배포판에서 제공하는 기본 (g ++ (Debian 10.2.1-1) 10.2.1 20201207) 버전을 사용 하시겠습니까?)
답변
내 질문에 답할 것 같아요.
GCC 위키의 지침을 따를 때 (https://gcc.gnu.org/wiki/cxx-modules) svn에서 찾은 버전과 비교하여 최신 버전입니다.
svn에는 gcc 버전 10이 있고 github에는 버전 11이 있습니다.
github 용 버전 (g ++ (GCC) 11.0.0 20201217 (실험용) [c ++-modules revision 20201220-2203])을 컴파일 할 때 GCC Wiki에서 제공하는 예제가 컴파일되고 작동합니다. 다음 파일은 hello.cpp입니다.
module;
#include <iostream>
#include <string_view>
export module hello;
export void greeter (std::string_view const &name)
{
std::cout << "Hello " << name << "!\n";
}
및 main.cpp
import hello;
int main (void)
{
greeter ("world");
return 0;
}
컴파일 할 명령은 다음과 같습니다. g ++ -fmodules-ts hello.cpp main.cpp
내가 이해하기 때문에 소스 파일의 순서가 중요하므로 hello.cpp를 main.cpp 전에 컴파일해야합니다.
따라서 현재로서는 사용자가 만든 모듈 만 작동하지만 표준 라이브러리 모듈은 작동하지 않는 것 같습니다 (#include는 여전히 필요함).
모듈 지원이 이제 gcc-11의 메인 브랜치와 병합 된 것 같습니다. 따라서 git 또는 svn을 통한 개발자 빌드 사용이 더 이상 필요하지 않습니다 (안타깝게도 이와 같은 표준 라이브러리 헤더는 아직 모듈로 변환되지 않습니다. 순간 가져 오기; 작동하지 않음).