首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用第三方库将c++项目编译为WebAssembly

用第三方库将c++项目编译为WebAssembly
EN

Stack Overflow用户
提问于 2020-04-21 09:44:58
回答 2查看 1.3K关注 0票数 2

我有一个简单的c++项目,其中包括本征。我能够在我自己的机器上编译这个项目,但是很难将它编译成带有emscripten的组件。

项目结构:

代码语言:javascript
复制
.
├── CMakeLists.txt
├── include
│   └── HelloWasm
│       └── my_lib.h
└── src
    ├── main.cpp
    └── my_lib.cpp

文件内容:

CMakeLists.txt

代码语言:javascript
复制
cmake_minimum_required( VERSION 3.0 )

project( HelloWasm )

# flags

# include files
include_directories( ./include .include/HelloWasm ./src )

# target
add_executable( HelloWasm ./src/main.cpp ./src/my_lib.cpp )

# 3rd party libs
find_package(Eigen3 REQUIRED NO_MODULE)
include_directories(${EIGEN3_INCLUDE_DIR})

include/HelloWasm/my_lib.h

代码语言:javascript
复制
#include <iostream>
#include <Eigen/Dense>

using namespace std;
using Eigen::MatrixXd;

class MyLib
{
private:
protected:
public:
    MyLib()
    {
    }
    ~MyLib()
    {
    }
    void eigen_test();
};

src/main.cpp

代码语言:javascript
复制
#include <iostream>
#include "HelloWasm/my_lib.h"

using namespace std;

int main()
{
    MyLib my_lib;
    my_lib.eigen_test();
}

src/my_lib.cpp

代码语言:javascript
复制
#include "HelloWasm/my_lib.h"

void MyLib::eigen_test()
{
    MatrixXd m(2, 2);
    m(0, 0) = 3;
    m(1, 0) = 2.5;
    m(0, 1) = -1;
    m(1, 1) = m(1, 0) + m(0, 1);
    cout << '\n'
         << m << endl;
}

在本地成功编译项目:

代码语言:javascript
复制
mkdir build && cd build
cmake ..
make

➜ ./HelloWasm

  3  -1
2.5 1.5

尝试编译到webassemply时出错

(我尝试遵循emscripten博士中提供的步骤)

代码语言:javascript
复制
mkdir build && cd build
cmake ..
emcmake cmake ..

产出:

代码语言:javascript
复制
configure: cmake .. -DCMAKE_TOOLCHAIN_FILE=/Users/me/programming/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake -DCMAKE_CROSSCOMPILING_EMULATOR="/Users/me/programming/emsdk/node/12.9.1_64bit/bin/node"
-- Configuring done
-- Generating done
CMake Warning:
  Manually-specified variables were not used by the project:

    CMAKE_TOOLCHAIN_FILE


-- Build files have been written to: /Users/me/programming/sandbox/cpp_sandbox/so_question_project/build

现在运行使:

代码语言:javascript
复制
➜  emmake make
make: make
Scanning dependencies of target HelloWasm
[ 33%] Building CXX object CMakeFiles/HelloWasm.dir/src/main.cpp.o
[ 66%] Building CXX object CMakeFiles/HelloWasm.dir/src/my_lib.cpp.o
[100%] Linking CXX executable HelloWasm
[100%] Built target HelloWasm

显然这并没有创建一个.wasm文件..。

做以下工作:

代码语言:javascript
复制
em++ CMakeFiles/HelloWasm.dir/src/main.cpp.o CMakeFiles/HelloWasm.dir/src/my_lib.cpp.o -o helloWasm.js

产出:

代码语言:javascript
复制
em++: warning: CMakeFiles/HelloWasm.dir/src/main.cpp.o is not a valid input file [-Winvalid-input]
em++: warning: CMakeFiles/HelloWasm.dir/src/my_lib.cpp.o is not a valid input file [-Winvalid-input]
em++: error: no input files
note that input files without a known suffix are ignored, make sure your input files end with one of: ('.c', '.i', '.cpp', '.cxx', '.cc', '.c++', '.CPP', '.CXX', '.C', '.CC', '.C++', '.ii', '.m', '.mi', '.mm', '.mii', '/dev/null', '.bc', '.o', '.obj', '.lo', '.dylib', '.so', '.a', '.ll', '.h', '.hxx', '.hpp', '.hh', '.H', '.HXX', '.HPP', '.HH')

我错过了什么.?

EN

回答 2

Stack Overflow用户

发布于 2020-04-22 06:22:20

更改:

代码语言:javascript
复制
em++ CMakeFiles/HelloWasm.dir/src/main.cpp.o CMakeFiles/HelloWasm.dir/src/my_lib.cpp.o -o helloWasm.js

至:

代码语言:javascript
复制
em++ CMakeFiles/HelloWasm.dir/src/main.cpp.o CMakeFiles/HelloWasm.dir/src/my_lib.cpp -o helloWasm.js

Emscripten无法编译my_lib.cpp.o,因为它已经编译成机器代码(它是一个对象文件)。您必须使用.cpp文件,而不是.cpp.o文件。

票数 0
EN

Stack Overflow用户

发布于 2020-04-28 16:24:28

我有个建议给你。

首先,可以将库文件(my_lib.h and my_lib.cpp)放在同一个目录中。

其次,您可以为应用程序(HelloWasm)创建一个文件夹,并将可执行代码(main.cpp)放在此文件夹中。

最后,您可以为每个文件夹创建CMakeLists.txt文件。

这是您的新目录树:

代码语言:javascript
复制
.
├── CMakeLists.txt
├── Applications
│   └── HelloWasm
│       ├── CMakeLists.txt
│       └── main.cpp
└── Libraries
    ├── CMakeLists.txt
    ├── my_lib.h
    └── my_lib.cpp

CMakeLists.txt (第一个):

代码语言:javascript
复制
cmake_minimum_required(VERSION 3.0)
project(LIBRARYANDAPPS)

#This function is starting build and looking all folders.

function( start_build )
  file( GLOB_RECURSE components "${CMAKE_SOURCE_DIR}/*/CMakeLists.txt" )
  foreach( component ${components} )
    get_filename_component( path ${component} PATH )
    add_subdirectory( ${path} )
  endforeach( )
endfunction( )

start_build()

CMakeLists.txt (用于HelloWasm):

代码语言:javascript
复制
#You can add Emscripten flags like this.
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
    -std=c++11 --bind \
    -s USE_WEBGL2=1 -s FULL_ES3=1 --memory-init-file 0")

find_package(Eigen3 REQUIRED NO_MODULE)
include_directories(${EIGEN3_INCLUDE_DIR})

include_directories("${CMAKE_SOURCE_DIR}/Libraries")

ADD_EXECUTABLE(HelloWasm main.cpp)

TARGET_LINK_LIBRARIES(HelloWasm MyLib Eigen)

CMakeLists.txt (图书馆):

代码语言:javascript
复制
find_package(Eigen3 REQUIRED NO_MODULE)
include_directories(${EIGEN3_INCLUDE_DIR})

ADD_LIBRARY(MyLib STATIC my_lib.cpp my_lib.h)

TARGET_LINK_LIBRARIES(MyLib Eigen)

通过这些编辑,您可以创建更大的项目,库。我觉得这样更有用。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61340521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档