programing

Windows에서 Clang을 컴파일하는 방법

goodcopy 2022. 8. 12. 00:03
반응형

Windows에서 Clang을 컴파일하는 방법

Clang이 Windows에서 작업할 수 있도록 방법을 찾고 있지만 문제가 있습니다.Clang이 컴파일을 성공시켰지만 프로그램을 컴파일하려고 하면 표준 헤더에 오류가 많이 발생합니다.

rubenvb의 훌륭한 사전 빌드 버전의 clang은 알고 있습니다만, 스스로 컴파일 하고 싶습니다.또, 아직 Windows 의 서포트가 그다지 좋지 않다고 하는 Going Native 의 강연도 듣고 있었습니다.Windows에서 작업하려면 어떻게 해야 하나요?

Windows 7에서 C++용 clang을 컴파일하기 위해 다음 방법을 사용했습니다.Mysticial 및 기타에 의해 검증되었습니다.

  1. MinGW를 다운로드하여 설치합니다(C++ 컴파일러를 설치하고 bin 폴더를 PATH에 넣습니다(MinGW 4.6.1이 있으며 4.6.2가 설치된 다른 컴퓨터에서 정상적으로 테스트되었습니다).
  2. PATH에 Python이 있는지 확인합니다(3개가 아니라 2.7이 있습니다).
  3. (옵션: PATH에 Perl이 포함되어 있는지 확인합니다(ActivePerl 5.14.2 64비트를 사용).
  4. CMake를 취득하여 PATH에 배치하다
  5. LLVM 다운로드 페이지로 이동하여 Clang 소스 코드와 함께 LLVM 3.0 소스 코드를 다운로드합니다.SVN에서 코드를 가져오지 마십시오. MinGW 헤더에서는 작동하지 않습니다.
  6. 소스 코드를 추출합니다.데스크탑의 llvm-3.0.src라는 폴더에 llvm 소스가 있습니다.
  7. clang 소스를 직접 llvm 소스 폴더 내의 "도구" 폴더에 있는 "clang" 폴더에 넣습니다(정확히 "clang"이라고 부르지 않으면 llvm을 빌드하지만 clang은 빌드되지 않습니다). 그러면 디렉토리가 다음과 같이 됩니다.
    • llvm 소스
      • autoconf 폴더
      • ...
      • 도구 폴더
        • ...
        • 쨍그랑 폴더
          • 바인딩 폴더
          • ...
          • 파일 만들기
          • ...
        • ...
      • ...
  8. llvm 소스 폴더와 같은 디렉토리에 "build"라는 이름의 폴더를 만듭니다.
  9. 명령줄과 cd를 빌드 폴더로 엽니다.
  10. 명령어를 실행합니다.cmake -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release ..\llvm-3.0.src

    • (마지막 인수는 llvm 소스(및 tools/clang 서브디렉토리의 clang 소스)가 있는 폴더의 상대 경로입니다).

    • 이렇게 하면 "configure" 명령어와 동일한 작업이 수행되며 makefile 및 모든 것이 빌드 폴더에 생성됩니다.

    • 이 작업은 몇 분 정도 걸립니다.
  11. 명령어를 실행합니다.mingw32-make

    • 그러면 llvm과 clang이 컴파일되고 clang 실행 파일이 빌드/bin 폴더에 생성됩니다.
    • 이것은 시간이 오래 걸릴 것이다.(병렬 빌드를 추가하여 속도를 높일 수 있습니다.-j<number>옵션)컴파일러가 쓰고 있는 폴더에 잠금을 가하는 등 오랜 시간이 걸리는 컴파일 프로세스를 방해하지 않도록 다른 프로그램을 모두 닫는 것이 좋습니다.생성된 파일을 스캔하여 방해가 되지 않도록 바이러스 백신 및 방화벽 소프트웨어도 껐습니다.

테스트 시간

  1. build/bin 폴더에 .cpp 파일을 만듭니다(hello.cpp 사용).표준 라이브러리 헤더를 사용하여 포함 경로 및 라이브러리가 작동하는지 확인합니다.아주 간단한 프로그램부터 시작하세요.

    (처음부터:

    #include <iostream>
    
    int main() {
        std::cout << "hi";
    }
    

    )

  2. 명령어를 실행합니다.clang hello.cpp -std=c++0x -I"C:\MinGW\lib\gcc\mingw32\4.6.1\include\c++" -I"C:\MinGW\lib\gcc\mingw32\4.6.1\include\c++\mingw32" -Lc:/mingw/bin/../lib/gcc/mingw32/4.6.1 -Lc:/mingw/bin/../lib/gcc -Lc:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../../mingw32/lib -Lc:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../.. -L/mingw/lib -lstdc++ -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt

    (-L은 라이브러리를 검색할 디렉토리를 지정하고 -l은 링크할 라이브러리를 지정합니다.) (MinGW가 나와 같은 경로에 설치되어 있지 않은 경우 "g++ somefile.cpp -v" 명령을 사용하여 경로를 검색하여 g++가 라이브러리 경로 및 라이브러리 파일에 어떤 옵션을 사용하고 있는지 알 수 있습니다.-L 및 -l 옵션의 출력 끝 부근에 있습니다.-L이 포함된 .o 파일 이름에 주의하십시오.Clang은 g++와 같은 옵션을 많이 사용하기 때문에 g++의 출력에서 그 행을 문자 그대로 복사하여 붙여넣었습니다.)

    그러면 프로그램이 컴파일되고 a.out이라는 이름의 파일이 생성됩니다.

  3. a.out의 이름을 a.exe로 변경합니다.

  4. .exe를 실행합니다.
  5. 프로그램이 실행되어야 합니다.

Clang(3.0)은 Windows에서 아직 문제가 있습니다(Linux에서도 문제가 발생하고 있는지 모르겠습니다).예를 들어 lamda(clang은 지원하지 않음)를 -std=c++0x로 컴파일하면 clang이 크래쉬하고 진단 오류가 발생합니다.(llVM IRC에서 clang이 람다에 대해 파싱을 구현하지만 의미 분석은 구현하지 않기 때문에 3개의 램다를 파싱하는 것을 잊었기 때문에)릴리스) 및 이미 이 버그에 대해 알고 있습니다.)

또한 저명한 Mysticial은 이 가이드를 테스트하는 데 친절히 동의하고 테스트 중에 몇 가지 관찰을 했습니다.

  1. Windows 헤더는 동작하고 있는 것 같습니다.
  2. 현재 32비트에서만 작동합니다.
  3. 64비트는 컴파일은 정상적으로 되지만 조립은 되지 않습니다.
  4. SSE는 괜찮을 겁니다.([Mysticial]는 32비트로 동작하는SSE를 테스트하지 않았습니다).

다음은 Windows 8.1 환경에서 동작하는 것으로, Seth의 지시와 전체적으로 비슷하지만, 보다 새로운 툴로 동작합니다.

  1. MinGW 64를 설치했습니다.C:/MinGW정확히 말하면 STL의 디스트로(distro)를 사용하고 있습니다.
  2. Python 3를 설치했는데 최신 버전을 가져왔어요.
  3. CMake 3.0.2를 설치했습니다.
  4. LLVMClang을 Github으로 분기하여 기계에 복제하고 Clang의 repo를 llvm\tools\clang 폴더에 저장했습니다( 구조는 공식 페이지에 기술되어 있습니다.git 대신 svn으로 표시됩니다).
  5. "llvm" 폴더 옆에 "build" 폴더를 만들고 "build" 폴더 내에서 다음 명령을 실행했습니다.cmake -G "MinGW Makefiles" -D"CMAKE_MAKE_PROGRAM:FILEPATH=C:/MinGW/bin/make.exe" -DCMAKE_BUILD_TYPE=Release ..\llvm(어떤 이유로 CMake가 자동으로 "make"를 찾을 수 없었습니다.)
  6. 그리고 실제로 만들기 위해 "만들기"를 실행했습니다.두 시간 정도 걸렸어요
  7. 그 후 다른 폴더에 1.cpp를 작성했습니다.이 폴더에서는 람다 식을 실행하여 "hi"를 인쇄합니다.
#include <iostream>

int main() {
    []{ std::cout << "hi"; }();
}
  1. cpp를 컴파일하기 위한 cmd 파일도 만들었습니다.또는 다른 방법을 통해 PATH 변수를 올바르게 설정할 수도 있습니다.MinGW 패키지의 GCC 버전이 다를 수 있습니다.또한 Clang에는 몇 가지 내장 경로가 있지만 특정 GCC 버전에 연결되어 있으며, 내 경로는 이 버전에 포함되어 있지 않기 때문에 포함 경로를 명시적으로 제공해야 했습니다.
set PATH=<path to the build folder from step 5>/bin;c:/mingw/bin;%PATH% 
clang++ -std=c++11 1.cpp -o 1.exe -I"C:/MinGW/include"
-I"C:/MinGW/include/c++/4.9.1" -I"C:\MinGW\include\c++\4.9.1\x86_64-w64-mingw32" -I"C:\MinGW\x86_64-w64-mingw32\include"
  1. 이 cmd를 실행하면 1.cpp가 "hi"로 인쇄된 1.exe로 컴파일됩니다.

기능하지 않은 점:

  1. VS 2015 CTP의 MSVC 컴파일러를 사용하여 MinGW+GCC 없이 동일한 llvm+clang 소스를 구축해 보았습니다.Clang은 정상적으로 구축되었습니다.단, 다른 점은 Developer CMD 창에서 실행할 필요가 있다는 것입니다.cmake -G "Visual Studio 12" ..\llvmVisual Studio에서 솔루션을 컴파일합니다.단, Clang은 샘플 cpp를 컴파일하지 못했기 때문에 MinGW 표준 라이브러리 헤더 내의 "미신고 식별자 "char16_t" 및 "_int128은 이 타깃에서 지원되지 않습니다"에 대해 불만을 제기했습니다.clang-cl 헤더와 MS STL 헤더를 사용하면 "throw x(y)" 지정자에 대한 불만이 제기됩니다. 빌드에 추가 키를 제공해야 하는데 작동하지 않습니다.

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\xiosbase(293,4) : 오류: 아직 이 슬로우 식을 컴파일할 수 없습니다_THROW_NCEE(실패, "ios_base:eofbit set"); C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\xstdef(56,30): 메모: 매크로 '_SLOW_NCEE' #define _SLOW_NCEE(x, y) throw x(y)에서 확장되었습니다.

http://clang.llvm.org/get_started.html#buildWindows 를 참조해 주세요.

"Visual Studio 11 Win64"를 cmake와 함께 사용하여 현재 사용 가능한 VS Express for Desktop과 연동됩니다.

lib에는 MinGW-W 64를 사용하고 있으며, 누락된 파일에는 SUA를 사용하고 있습니다.http://mingw-w64.sourceforge.net/ 및 http://www.suacommunity.com/

W64 바이너리에서 사용하기 위해 clang++에 의해 컴파일된 .o를 링크하기 위해 W64의 성과물에 포함된 ld linker와 함께 -m i386pep를 사용합니다.

VS를 사용하여 LLVM을 구축하고 Unix 사용자가 되어 명령줄에서 소스를 구축하는 데 많은 문제가 있었습니다.

Seth Carnegie의 지시에 따라 제공된 패키지가 아닌 SVN 저장소에서 LLVM v3.3과 MinGW v4.5.2를 사용하여 구축했습니다.

언급URL : https://stackoverflow.com/questions/9427356/how-to-compile-clang-on-windows

반응형