2016-12-18 24 views
0

일부 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를 지원해야합니다.
+0

내가 아는 한 LLVM 비트 코드는 여전히 컴퓨터에 종속적입니다. 라이브러리와 링크를 컴파일하는 가장 좋은 방법은 - enable-llvm 및 -flte 플래그와 함께 ld/lld를 사용하는 것입니다. llvm 비트 코드 형식의 객체를 선택하고 전체 프로그램 최적화를 수행 한 후 최종 바이너리에 연결합니다. – berkus

+0

왜 비트 코드가 여전히 기계에 의존적인지 설명 할 수 있습니까? syscalls 만 차이를 만들 것이라고 생각하지만 C 런타임을 사용하려고합니다. llvm 웹 페이지에서 lld 프로젝트를 찾았습니다. 불행히도 나는 커맨드 라인 옵션에 대해 자금을 지원하지 않았다. f, l, t, e 플래그가 무엇을 설명 할 수 있습니까? 정상적인 gnu ld 커맨드 라인에서 나는이 스위치를 찾지 못했습니다. – user2281723

+0

자세한 내용은 아래 Anton의 답변을 참조하십시오. – berkus

답변

1

LLVM IR은 타겟 특정 및 플랫폼 특정 언어 (C/C++)에서 생성되어 타겟 중립적이지 않습니다. 타입 크기, 정렬, ABI 요구 사항 등을 고려하십시오. 전처리 기와 같은 순수한 소스 코드 기능은 말할 것도 없습니다. 따라서 여러분이 생각한 접근 방식은 전혀 작동하지 않습니다.

자세한 내용은 LLVM bitcode cross-platform을 참조하십시오.

+0

링크를 제공해 주셔서 감사합니다! 알고리즘에서 모든 전문 지식을 피하려면 어떻게해야합니까? 우리가 가지고있는 것은 대부분 숫자 크 런칭 알고리즘이므로 플랫폼 의존적 인 전 처리기 매크로, 특수 호출 규칙 (stdcall 등)과 같은 특별한 것들 - cdecl을 제외하고는 예상되지 않습니다. 우리가이 규칙들로 자신을 제한한다면 그것은 여전히 ​​불가능하거나 쓸모가 없다고 생각합니까? – user2281723

+0

예. 예를 들어 std :: vector - sizeof (size_t) 또는 sizeof (void *)에 대해 생각해보십시오. –