簡體   English   中英

如何使用 Emscripten-1.38.31 (??) 編譯 Boost-1.76.0

[英]How to compile Boost-1.76.0 with Emscripten-1.38.31 (??)

我已經搜索了這個答案的高低,我認為它應該在現代環境中得到回答。 我看到的大多數東西都是 2013 年或最遲 2015 年的,以及 2019 年的評論。

首先,我使用的是最新版本的 xcode 12.4 的 macOS 11.2。

我從 git 克隆並安裝了最新(截至今天)用於 boost 和 emscripten 的存儲庫。

出於某種原因,在我的項目中嘗試將 enscripten 標志集成到我的 CMakeLists.txt 文件中時出現運行錯誤

$ cmake..然后$ make .

CMakeLists.txt 文件:

cmake_minimum_required(VERSION 3.17)
project(FernQuest) #emscripten version

if (${CMAKE_SYSTEM_NAME} MATCHES "Emscripten")
    message(STATUS "using emscripten")
endif ()
if (NOT ${CMAKE_SYSTEM_NAME} MATCHES "Emscripten")
    message(STATUS "using cmake")
endif ()

#options
option(JS_ONLY "Compiles to native JS (No WASM)" OFF)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/out)

include_directories(.)
include_directories(/usr/local/include) #where boost in located

message(STATUS "finding boost!")
find_package(Boost 1.74.0 REQUIRED serialization system filesystem COMPONENTS serialization system filesystem)

if(Boost_FOUND)
    message(STATUS "found boost!")
endif()

include_directories(${Boost_INCLUDE_DIR})
link_directories(${Boost_LIBRARY_DIR})

if(NOT Boost_FOUND)
    message(FATAL_ERROR "Could not find boost!")
endif()

message(STATUS "setting sources")
SET(FQ_SRCS
    ../src/FernQuest.cpp
    ../src/Item.cpp
    ../src/Item.h
    ../src/Player.cpp
    ../src/Player.h
    ../src/Game.cpp
    ../src/Game.h
    ../src/QuestLog.cpp
    ../src/QuestLog.h)


SET(CMAKE_C_COMPILER emcc)
SET(CMAKE_CPP_COMPILER em++)


add_executable(FernQuest ${FQ_SRCS})


if(Boost_FOUND)
  if(JS_ONLY)
    message(STATUS "Setting compilation target to native JavaScript")
    set(CMAKE_EXECUTABLE_SUFFIX ".js")
    set_target_properties(FernQuest PROPERTIES COMPILE_FLAGS "-s USE_BOOST_HEADERS=1" LINK_FLAGS "-s USE_BOOST_HEADERS=1 -s WASM=0 -s EXPORTED_FUNCTIONS='[_main]'")
  else(JS_ONLY)
    message(STATUS "Setting compilation target to WASM")
    set(CMAKE_EXECUTABLE_SUFFIX ".wasm.js")
    set_target_properties(FernQuest PROPERTIES COMPILE_FLAGS "-s USE_BOOST_HEADERS=1" LINK_FLAGS " -s USE_BOOST_HEADERS=1 -s WASM=1 -s EXPORTED_FUNCTIONS='[_main]'")
  endif(JS_ONLY)
endif()

錯誤:

-- The C compiler identification is AppleClang 12.0.0.12000032
-- The CXX compiler identification is AppleClang 12.0.0.12000032
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- using cmake
-- finding boost!
-- Found Boost: /usr/local/lib/cmake/Boost-1.76.0/BoostConfig.cmake (found suitable version "1.76.0", minimum required is "1.74.0") found components: serialization system filesystem serialization system filesystem 
-- found boost!
-- setting sources
-- Setting compilation target to WASM
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/codiecottrell/Documents/FernQuest/emscripten/build
Scanning dependencies of target FernQuest
[ 16%] Building CXX object CMakeFiles/FernQuest.dir/Users/codiecottrell/Documents/FernQuest/src/FernQuest.cpp.o
clang: error: no such file or directory: 'USE_BOOST_HEADERS=1'
make[2]: *** [CMakeFiles/FernQuest.dir/Users/codiecottrell/Documents/FernQuest/src/FernQuest.cpp.o] Error 1
make[1]: *** [CMakeFiles/FernQuest.dir/all] Error 2
make: *** [all] Error 2

所以我讀了,他們說要解決這個問題,你可以在下面使用它來實際使用-DCMAKE_TOOLCHAIN_FILE運行它:

$ emcmake cmake..然后$ emmake make

發生此錯誤:

configure: cmake .. -DCMAKE_TOOLCHAIN_FILE=/Users/codiecottrell/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake -DCMAKE_CROSSCOMPILING_EMULATOR="/Users/codiecottrell/emsdk/node/14.15.5_64bit/bin/node"
-- using emscripten
-- finding boost!
CMake Error at /usr/local/Cellar/cmake/3.19.4/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:218 (message):
  Could NOT find Boost (missing: Boost_INCLUDE_DIR serialization system
  filesystem serialization system filesystem) (Required is at least version
  "1.74.0")
Call Stack (most recent call first):
  /usr/local/Cellar/cmake/3.19.4/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:582 (_FPHSA_FAILURE_MESSAGE)
  /usr/local/Cellar/cmake/3.19.4/share/cmake/Modules/FindBoost.cmake:2193 (find_package_handle_standard_args)
  CMakeLists.txt:21 (find_package)


-- Configuring incomplete, errors occurred!
See also "/Users/codiecottrell/Documents/FernQuest/emscripten/build/CMakeFiles/CMakeOutput.log".
make: make
-- using emscripten
-- finding boost!
CMake Error at /usr/local/Cellar/cmake/3.19.4/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:218 (message):
  Could NOT find Boost (missing: Boost_INCLUDE_DIR serialization system
  filesystem serialization system filesystem) (Required is at least version
  "1.74.0")
Call Stack (most recent call first):
  /usr/local/Cellar/cmake/3.19.4/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:582 (_FPHSA_FAILURE_MESSAGE)
  /usr/local/Cellar/cmake/3.19.4/share/cmake/Modules/FindBoost.cmake:2193 (find_package_handle_standard_args)
  CMakeLists.txt:21 (find_package)


-- Configuring incomplete, errors occurred!
See also "/Users/codiecottrell/Documents/FernQuest/emscripten/build/CMakeFiles/CMakeOutput.log".
make: *** [cmake_check_build_system] Error 1

我的問題:似乎 enscripten 通過自己的方式運行它時找不到提升,但是 cmake 可以清楚地找到它。 正如我在兩個文檔中所讀到的,還支持通過 emscripten 運行 boost,但是沒有明確的方法。 這是什么方式,我哪里出錯了? 我會繼續排查問題

編輯

剛試過$ emconfigure./b2 toolset=gcc --prefix=/usr/local/B2

它並沒有改變任何東西

如果您使用 emscripten 進行構建,那么您的 mac 上的庫(cmake 正在搜索的地方)將不起作用; 您將需要靜態編譯它們。
我建議嘗試在沒有CMake 的情況下構建您的項目。 如果您的項目僅使用 boost 標頭(而不是庫),那么這樣的事情可能會起作用:

$ em++ ../src/*.cpp -o index.html -s USE_BOOST_HEADERS=1

否則你還需要編譯 Boost。 一旦你完成了這些並且你有一個libboost.a文件,你可以像這樣編譯你的程序:

$ em++ ../src/*.cpp -c -s USE_BOOST_HEADERS=1

然后鏈接它:

$ em++ *.o /path/to/libboost.a -o index.html

當然,根據您使用的其他庫,您需要調整這些命令。 但總體思路是將所有依賴項編譯成 static 歸檔 (.a) 文件,然后將它們一起編譯得到生成的.html (or.js or.wasm) 文件。 閱讀有關使用 emcc 編譯的更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM