2013-03-30 15 views
24

Web uygulamasına dönüştürmek istediğim bir C++ projem var. Bu amaçla, projeyi oluşturmak için Emscripten'i kullanmak istiyorum.Emscripten ile Yükseltmeyi Kullanma

Proje, bazı dış kütüphaneleri kullanmaktadır. Pek çok kütüphanenin JavaScript versiyonunu derlemeyi veya bulmayı başardım ve şimdi Boost olanlarla sıkıştım. Aslında Boost için nasıl başlayacağımı bile bilmiyorum: kütüphaneleri oluşturmak için dosyaları oluşturmak için bir boostrap betiği kullanıyorlar. Araç setini bu betiğe aktarmak mümkündür ancak Emscripten açıkça desteklenmemektedir.

Projem, Boost'un aşağıdaki bölümlerini kullanmaktadır: Thread, Regex, FileSystem, Signals, System. Emscripten kullanarak bu kütüphaneleri nasıl derleyebilirim?

# Compiler configuration. This definition will be used unless 
# you already have defined some toolsets in your user-config.jam 
# file. 
if ! gcc in [ feature.values <toolset> ] 
{ 
    using gcc ; 
} 

# Compiler configuration. This definition will be used unless 
# you already have defined some toolsets in your user-config.jam 
# file. 
if ! gcc in [ feature.values <toolset> ] 
{ 
    using gcc : : "/full/path/to/em++" ; 
} 

ile:

Düzenleme

npclaudiu cevabını ardından, gcc araç ile kütüphane bootstrapped, sonra yerine derleyici yapılandırmak için project-config.jam düzenlenebilir

Şimdi, ./b2 yazarak kütüphaneler etkili bir şekilde oluşturulur. Boost.Signals ve Boost.System iyi derleyin. Diğerleri bazı hatalar var.

libs/thread/src/pthread/thread.cpp:503:27: error: use of undeclared identifier 'pthread_yield' 
     BOOST_VERIFY(!pthread_yield()); 
        ^

Boost.Regex bildirilmemiş olması CHAR_BIT hakkında çok şey şikayet ama emscripten bir sorun gibi görünüyor:

Boost.Thread şikayet

In file included from libs/regex/build/../src/c_regex_traits.cpp:28: 
In file included from ./boost/regex/v4/c_regex_traits.hpp:26: 
In file included from ./boost/regex/v4/regex_workaround.hpp:35: 
/path/to/emscripten/system/include/libcxx/vector:1989:92: error: use of undeclared identifier 'CHAR_BIT' 
static const unsigned __bits_per_word = static_cast<unsigned>(sizeof(__storage_type) * CHAR_BIT); 
                        ^

Boost.FileSystem başarısız görünüyor emscripten dolayı:

In file included from libs/filesystem/src/windows_file_codecvt.cpp:21: 
/path/to/emscripten/system/include/libcxx/cwchar:117:9: error: no member named 'FILE' in the global namespace 
using ::FILE; 
     ~~^ 
+0

Web arka uç veya ön uç:

şöyle b2 (veya bjam) ile derlemek sonra normal olarak, boostrap boost kullanmak için? –

+0

Ön taraf olurdu. Bu bir web tarayıcısında oynanabilir olmak istediğim bir oyundur. – Julien

+1

Sadece merak olmak için, emscripten kodu derlendiğinde Boost kaç tane alır? : D – GameDeveloper

cevap

21

Nihayet gerekli kütüphaneleri emscripten ile derlemeyi başardım. İşte takip ettiğim adımlar. system/include/libcxx/climits aşağıdaki tanımları eklemek için emscripten

Düzen

Değişiklikler (http://github.com/kripken/emscripten/issues/531 bakınız):

#ifndef CHAR_BIT 
# define CHAR_BIT __CHAR_BIT__ 
#endif 

#ifndef CHAR_MIN 
# define CHAR_MIN (-128) 
#endif 

#ifndef CHAR_MAX 
# define CHAR_MAX 127 
#endif 

#ifndef SCHAR_MIN 
# define SCHAR_MIN (-128) 
#endif 

#ifndef SCHAR_MAX 
# define SCHAR_MAX 127 
#endif 

#ifndef UCHAR_MAX 

# define UCHAR_MAX 255 
#endif 

#ifndef SHRT_MIN 
# define SHRT_MIN (-32767-1) 
#endif 

#ifndef SHRT_MAX 
# define SHRT_MAX 32767 
#endif 

#ifndef USHRT_MAX 
# define USHRT_MAX 65535 
#endif 

#ifndef INT_MAX 
# define INT_MAX __INT_MAX__ 
#endif 

#ifndef INT_MIN 
# define INT_MIN (-INT_MAX-1) 
# define INT_MIN (-INT_MAX-1) 
#endif 

#ifndef UINT_MAX 
# define UINT_MAX (INT_MAX * 2U + 1) 
#endif 

#ifndef LONG_MAX 
# define LONG_MAX __LONG_MAX__ 
#endif 

#ifndef LONG_MIN 
# define LONG_MIN (-LONG_MAX-1) 
#endif 

#ifndef ULONG_MAX 
# define ULONG_MAX (LONG_MAX * 2UL + 1) 
#endif 

paylaşılan kütüphaneler

olarak system/include/libcxx/cwchar

#include <cstdio> 

Derleme Boost aşağıdaki satırı ekleyin

npclaudiu tarafından önerildiği gibi, gcc araç setini kullanarak kütüphaneyi bootstrap edin. ./b2 thread regex filesystem signals system

derleme: Sonra kütüphaneler derlemek hat 67.

etrafında,

# Compiler configuration. This definition will be used unless 
# you already have defined some toolsets in your user-config.jam 
# file. 
if ! gcc in [ feature.values <toolset> ] 
{ 
    using gcc ; 
} 

Kuvvet BOOST_HAS_SCHER_YIELD

# Compiler configuration. This definition will be used unless 
# you already have defined some toolsets in your user-config.jam 
# file. 
if ! gcc in [ feature.values <toolset> ] 
{ 
    using gcc : : "/full/path/to/emscripten/em++" ; 
} 

ile boost/config/posix_features.hpp yılında: Sonra derleyici yapılandırıp yerine project-config.jam düzenlemek Statik kütüphaneler olarak artırma

sonra, tüm yukarıdaki adımları yapın tools/build/v2/tools/gcc.jam düzenlemek ve değiştirin:

toolset.flags gcc.archive .AR $(condition) : $(archiver[1]) ; 

toolset.flags gcc.archive .RANLIB $(condition) : 
    "/full/path/to/emscripten/emranlib" ; 

Zorunlu ile

toolset.flags gcc.archive .AR $(condition) : "/full/path/to/emscripten/emar" ; 

ve

toolset.flags gcc.archive .RANLIB $(condition) : $(ranlib[1]) ; 

ile ile kütüphaneler: ./b2 link=static variant=release threading=single runtime-link=static thread signals system filesystem regex

+0

Harika bir çalışma @julien. Yolları kodlamak yerine 'user-config.jam' kullanmayı denediniz mi? – abergmeier

+0

@LCIDFire Boost'un konfigürasyon dosyalarına yeterince aşina değildim, bu yüzden 'user-config.jam' denemedim. Gerçekten bir deneme-yanılma ilerlemesiydi ve hala oyunum başlamadan önce yapacak işlerim var. – Julien

+0

tamam, eğer istersen irc'ye vurabilirsin. – abergmeier

1

Bunu görüp görmediğinizi bilmiyorum Özellikle FAQ soru, ama durumda değil var:

S. nasıl vb SDL, boost, gibi sistem kütüphaneleri karşı bağlarım? A. derscripten - libc, libC++ (C++ STL) ve SDL ile birlikte verilen sistem kitaplıkları, derlendiğinizde (ve bunların yalnızca gerekli bölümlerini) otomatik olarak eklenir. A.Diğer derleyicilerin aksine -lSDL'ye bile ihtiyacınız yoktur (ancak -SDL, aynı zamanda incitmez).

Diğer kitaplıklar emscripten, destekçisi ile birlikte verilmez, kendinizi projenizde bir modül olsaydınız, programınızı kendiniz derleyin ve bağlantılandırmanız gerekir. Örneğin, bkz. BananaBread links in libz. (Özel yükseltme durumunda, yalnızca destek başlıklarına ihtiyaç duyarsanız, hiçbir şey derlemenize gerek yoktur.)

İçerilmeyen kütüphaneler için başka bir seçenek de bunları bir JS kitaplığı olarak uygulamaktır, emscripten gibi libc (eksi malloc) ve SDL (libC++ veya malloc değil) için. Emcc'de --js-kütüphanesine bakınız. Emscripten kendisi as being a drop-in replacement for gcc önerir olarak

+1

Bu soruyu gördüm ve bu yüzden Boost'u emscripten ile derlemeye çalışıyorum. – Julien

2

Sen, araç grubu olarak gcc belirterek Boost kitaplıkları yapılandırma deneyebilirsiniz.Ayrıca, Boost'u bu dava için statik kütüphaneler olarak oluşturursanız daha iyi olacağını düşünüyorum. Boost kütüphanelerinin çoğunun sadece başlık olduğunu, çünkü sadece şablon sınıflarını/fonksiyonlarını tanımladıklarını unutmayın.

+0

Sorumluluğumda listelenen Boost kitaplıkları yalnızca başlık değil, aksi takdirde çok kolay olurdu :) Çözümünüzü deneyeceğim, yalnızca Boost'a "gcc" yerine "emcc" ile derlenmesini söylemem gerek. – Julien

3

Kayıt için artık Boost, (benim tecrübemde) yukarıda açıklanan işlemi gereksiz yapan bir "emscripten" araç seti içeriyor.

b2 toolset=emscripten