2013-06-12 3 views
9

여러 운영 체제 용 건물을 지원하는 코드베이스로 작업하는 경우 Emscripten을 수정해야하는 곳을 조건부 컴파일의 도움으로 동일한 코드베이스에 통합하는 것이 합리적입니다. 다른 환경에서도 계속 사용할 수 있습니다.emscripten의 코드를 조건부로 컴파일하려면 어떻게해야합니까?

주제에 대한 문서가없는 것 같지만 매우 열악한 것으로 보이거나 그것에 대해 궁금한 점이 있거나 매우 놀랍습니다. 및 문서화 된 영토.

어떻게하면됩니까?

이 (내가 tools/shared.py 살펴 보았다,이 #ifdef EMSCRIPTEN 또는 #ifdef __EMSCRIPTEN__이 사용될 수 있음을 시사하는 것 같다, 나는 아직도 내가 올바른 생각하면이 그것을하는 올바른 방법은 아마도, 심지어 여부를 결정하기 위해이 질문을 부탁 해요한다 사용해야합니다.)

답변

8

Detecting Emscripten in preprocessor에 따르면 올바른 정의는 __EMSCRIPTEN__입니다.

2016 년 10 월 이 활성화되면 EMSCRIPTEN 정의가 제거됩니다. 따라서 EMSCRIPTEN을 사용하는 것이 아닌 이 아닌이 아닌 경우에도 여전히 엄격하지 않은 빌드 모드에서 작동합니다.

4

#ifdef EMSCRIPTEN이 선호되는 AFAIK입니다.

#ifdef으로 소스 코드를 어지럽히기 전에 특정 플랫폼 종속 파일을 가지고 있고 빌드 도구로 작업하게하는 것이 더 합리적이지 않은지 생각해보십시오.

또한 emscripten은 이미 리눅스 시스템과 비슷하게 LINUX을 정의합니다. 일반적으로이 동작은 플랫폼 처리의 필요성을 대부분 수정합니다.

2

이 내 현재의 솔루션입니다 :

  • 나는 보통의 목표와 리눅스 Makefile을 가지고, 그것은 이전에 생성 된 정적 라이브러리를 연결하고 실행 파일을 출력합니다.

  • 코드는 ifdef로 웹 정의에 따라 작동합니다.

  • Makefile을 플랫폼 관련 소스에 대한 표적 환경 변수에 따라 라이브러리 행위 :

 
    ifeq ($(TARGET),WEB) 
     MODULES = RenderingEngine2.o RenderingEngine1.o WebApp.o main.o 
    else 
     MODULES = RenderingEngine2.o RenderingEngine1.o LinuxApp.o main.o 
    endif 
  • 메이크 함께 다음과 같은 내용으로 emscripten.sh라는 bash는 스크립트가 :
 
    #!/bin/bash 

    make TARGET="WEB" CXX="em++ -DWEB" AR="emar" modules 
    make TARGET="WEB" CXX="em++ -DWEB" AR="emar" 
    emcc --preload-file assets -o bin/helloArrow.html bin/helloArrow bin/lib.o 
    firefox bin/helloArrow.html 
    ,
  • 컴파일 및 ./emscripten.sh

참고로 실행합니다 emscripten 그래서 당신은 확장자가 .o 라이브러리의 이름을 정적 라이브러리에서 .A 확장을 좋아하지 않는 것 같습니다.

관련 문제