2013-06-12 29 views
9

Làm việc với một codebase hỗ trợ xây dựng cho nhiều Hệ điều hành, nó chỉ là hợp lý, nơi mà các sửa đổi cho Emscripten được yêu cầu, để tích hợp chúng vào cùng một codebase, với sự trợ giúp của trình biên dịch có điều kiện để nó tiếp tục hoạt động trong các môi trường khác. Tuy nhiên, dường như không có bất kỳ tài liệu nào về chủ đề, điều này dường như rất kém với tôi, cũng như tôi không thể tìm thấy bất kỳ câu hỏi nào về nó, điều này có vẻ rất đáng ngạc nhiên đối với tôi — tôi mong đợi nó sẽ trở nên tốt và lãnh thổ tài liệu.Làm cách nào để tôi có thể biên dịch mã cho emscripten?

Tôi làm cách nào để thực hiện việc này?

(Tôi đã xem xét tools/shared.py, điều này dường như cho thấy rằng #ifdef EMSCRIPTEN hoặc #ifdef __EMSCRIPTEN__ thể được sử dụng, tôi vẫn đang hỏi câu hỏi này để xác định nếu tôi đúng, nếu điều này là đúng cách để làm việc đó, thậm chí đó nên được sử dụng.)

Trả lời

8

Theo Detecting Emscripten in preprocessor, xác định chính xác để sử dụng là __EMSCRIPTEN__.

Vào tháng 10 năm 2016, a strict build mode was introduced, khi được bật, xóa xác định EMSCRIPTEN. Do đó, không phải là được khuyến nghị sử dụng EMSCRIPTEN mặc dù nó vẫn hoạt động ở chế độ xây dựng không nghiêm ngặt.

4

#ifdef EMSCRIPTEN là cách được ưu tiên AFAIK.

Trước khi làm lộn xộn mã nguồn của bạn với #ifdef s, hãy suy nghĩ về việc sẽ không có ý nghĩa hơn nếu có tệp phụ thuộc vào nền tảng nhất định và để công cụ xây dựng thực hiện công việc.

Ngoài ra, emscripten đã định nghĩa LINUX, vì nó xử lý rất giống hệ thống Linux. Thông thường, hành vi này đã khắc phục hầu hết nhu cầu xử lý nền tảng.

2

Đây là giải pháp hiện tại của tôi:

  • Tôi có một Makefile linux với mục tiêu thông thường, nó liên kết thư viện tĩnh tạo ra trước đây và kết quả đầu ra một thực thi.

  • Mã hoạt động khi định nghĩa WEB bằng ifdef.

  • Các Makefile đối với hành vi thư viện khi biến MỤC TIÊU môi trường đối với nguồn cụ nền tảng:

 
    ifeq ($(TARGET),WEB) 
     MODULES = RenderingEngine2.o RenderingEngine1.o WebApp.o main.o 
    else 
     MODULES = RenderingEngine2.o RenderingEngine1.o LinuxApp.o main.o 
    endif 
  • Dọc theo Makefile có một kịch bản bash gọi emscripten.sh với nội dung sau :
 
    #!/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 
  • Biên dịch và thực thi với ./emscripten.sh

LƯU Ý: emscripten dường như không thích .a mở rộng trong thư viện tĩnh để đặt tên cho thư viện với đuôi .o.