일부 C++ 팀으로 구성된 프로젝트에서 작업하고 있습니다. 각 팀은 라이브러리를 제공하며 팀은 이러한 라이브러리를 프런트 엔드 애플리케이션에 통합합니다.llvm 라이브러리 사용 방법
응용 프로그램이 서로 다른 플랫폼이므로 다른 팀이 서로 다른 플랫폼/CPU 아키텍처/구성에 대해 컴파일 된 동일한 (정적) 라이브러리를 제공해야 함을 의미합니다. 예 : 우리는 Visual Studio 2015/2013, 32bit/64bit, Linux, Debug/Release 등을 가지고 있습니다.
이 정적 라이브러리 "manifests"의 수를 줄이는 것이 좋을 것이므로 Clang/LLVM을 살펴 보았습니다. 이 아이디어는 정적 라이브러리를 LLVM 비트 코드로 컴파일하고 llvm-ar 도구를 사용하여 llvm 정적 라이브러리를 작성합니다. 특정 플랫폼 용 바이너리를 만들려면 llc (LLVM 플랫폼 컴파일러)를 사용하여 원시 코드 정적 라이브러리를 만들고 플랫폼 링커와 연결하십시오.
질문 :
- 내가 달성하고자하는 일을 할 수있는 더 나은 방법이 있나요?
- llc는 정적 라이브러리의 컴파일을 지원하지 않지만 개별 번역 단위 (.bc -> .o) 만 지원합니다. 물론 각 개별 비트 코드 파일을 추출하여 원시 객체 파일로 어셈블하고 플랫폼 라이브러리 도구 (lib/ar)를 사용하여 정적 라이브러리를 만들 수 있지만 좀 더 간소화 된 솔루션이 있는지 궁금합니다.
- 금 링커는 필자가 필요로하는 것처럼 보이지만 ELF 형식으로 제한되는 것으로 보입니다. Windows/Linux 및 IOS를 지원해야합니다.
내가 아는 한 LLVM 비트 코드는 여전히 컴퓨터에 종속적입니다. 라이브러리와 링크를 컴파일하는 가장 좋은 방법은 - enable-llvm 및 -flte 플래그와 함께 ld/lld를 사용하는 것입니다. llvm 비트 코드 형식의 객체를 선택하고 전체 프로그램 최적화를 수행 한 후 최종 바이너리에 연결합니다. – berkus
왜 비트 코드가 여전히 기계에 의존적인지 설명 할 수 있습니까? syscalls 만 차이를 만들 것이라고 생각하지만 C 런타임을 사용하려고합니다. llvm 웹 페이지에서 lld 프로젝트를 찾았습니다. 불행히도 나는 커맨드 라인 옵션에 대해 자금을 지원하지 않았다. f, l, t, e 플래그가 무엇을 설명 할 수 있습니까? 정상적인 gnu ld 커맨드 라인에서 나는이 스위치를 찾지 못했습니다. – user2281723
자세한 내용은 아래 Anton의 답변을 참조하십시오. – berkus