簡體   English   中英

Bazel 目標在 gcc 中編譯但在 emscripten 中失敗

[英]Bazel target compiles in gcc but fails in emscripten

我正在使用 Bazel 構建一個系統,其中我有一個 c++ 目標和一個要編譯為 web 程序集的 emscirpten (emcc) 目標。 兩者都依賴於“myAPI”,它具有外部依賴性 libpng、libz、opencv 和其他一些。

這編譯正確:

# Development
cc_binary(
    name = "devMain",
    srcs = ["dev/main.cpp"],
    copts = [
        "-w",
        "-g",
        "-O3",
        "--std=c++2a",
        "-pthread",
        "-Iinclude/",
        "-Iexternal/geometryCentralRepo/include",
        "-Iexternal/eigenRepo",
        "-DBUILD_VERSION=devMain",
        ],
    deps = [
        ":myAPI",
    ],
    linkopts = ["-lpthread"],
)

但是,這失敗了:

DEFAULT_EMSCRIPTEN_LINKOPTS = [
    "-s EXTRA_EXPORTED_RUNTIME_METHODS=['ccall']",
    "-s ALLOW_MEMORY_GROWTH=1",     # Our example doesn't need memory growth
    "-s ASSERTIONS=1",              # Turn off assertions
    "-s EXPORT_ES6=1",              # Export as es6 module, used for rollup
    "-s MODULARIZE=1",              # Allows us to manually invoke the initialization of wasm
    "-s EXPORT_NAME=myAPI",    # Not used, but good to specify
    "-s USE_ES6_IMPORT_META=0",     # Disable loading from import meta since we use rollup
    "-s EXPORT_ALL=1",
    "-s USE_PTHREADS=1",
    "-s ENVIRONMENT=worker",
    "-DNDEBUG",
]

WASM_LINKOPTS = [
    "-s WASM=1",
    "--bind",                    # Specify wasm output
]

cc_binary(
    name = "myAPI.js",
    srcs=["src/myAPI/WASM_bindings.cpp"],
    copts = [
        "-g",
        "-O3",
        "--std=c++2a",
        "-pthread",
        "-Iinclude/",
        ],
    linkopts = DEFAULT_EMSCRIPTEN_LINKOPTS + WASM_LINKOPTS,
    deps = [
        ":myAPI",
    ],

)

wasm_cc_binary(
    name = "setupModel-wasm",        
    cc_target = ":myAPI.js",
)

這是我的API:

cc_library(
    name = "myAPI",
    srcs = glob(["src/**/*.c*"], exclude=["src/myAPI/WASM_bindings.cpp"]),
    hdrs = glob(["include/**/*.h*"]),
    copts = [
        "-w",
        "-g",
        "-O3",
        "--std=c++2a",
        "-pthread",
        "-Iinclude",
        "-Iexternal/geometryCentralRepo/include",
        "-Iexternal/spdlogRepo/include",
        "-Iexternal/libiglRepo/include", 
        "-Iexternal/openCVRepo/include", 
        "-Iexternal/eigenRepo",
        ],
    deps = [
        "@eigenRepo//:eigen",
        "@libiglRepo//:libigl",
        "@geometryCentralRepo//:geoCentral",
        "@openCVRepo//:opencv_core",
        "@openCVRepo//:opencv_imgcodecs",
        "@spdlogRepo//:spdlog",
        "@libpngRepo//:libpng"
    ],      
    visibility = ["//visibility:public"],
)

最后,這些是所有依賴項:

本征:

load("@rules_cc//cc:defs.bzl", "cc_library")

cc_library(
    name = "eigen",
    hdrs =  glob(["Eigen/**", "unsupported/**"]),
    copts = ["-w", "-O3", "-pthread"],
    visibility = ["//visibility:public"],
)

libigl:

load("@rules_cc//cc:defs.bzl", "cc_library")

cc_library(
    name = "libigl",
    hdrs =  glob(["**/*.h*", "**/*.c*"]),
    copts = ["-w", "-O3", "-pthread"],
    visibility = ["//visibility:public"],
)

地理中心:

load("@rules_cc//cc:defs.bzl", "cc_library")

cc_library(
    name = "geoCentral",
    srcs = glob(["src/**/*.cpp"], 
    exclude=["src/utilities/unit_vector3.cpp", "src/surface/mesh_ray_tracer.cpp", "src/surface/detect_symmetry.cpp"]),
    hdrs = glob(["**/*.h", "**/*.ipp"]),
    copts = [
    "-w",
    "-O3",
    "-pthread",
    "-Iexternal/geometryCentralRepo/include", 
    "-Iexternal/geometryCentralRepo/deps", 
    "-Iexternal/geometryCentralRepo/src",
    "-Iexternal/geometryCentralRepo",
    "-Iexternal/geometryCentralRepo/deps/nanort/include",
    "-Iexternal/geometryCentralRepo/deps/happly", 
    "-Iexternal/eigenRepo", 
    "-Iexternal/nanoflann",
    "-Iexternal",
    "-Iexternal/happlyRepo/"],
    deps = ["@eigenRepo//:eigen", "@nanoflann//:nanoflann", "@happlyRepo//:happly"],
    visibility = ["//visibility:public"],
)

openCV:

load("@rules_cc//cc:defs.bzl", "cc_library")

package(default_visibility = ["//visibility:private"])


cc_library(
    name = "opencv_core",
    srcs = glob([
        "modules/core/src/**/*.cpp",
        "modules/core/src/**/*.hpp",
        "modules/core/include/**/*.hpp",
        "modules/core/include/**/*.h",
    ]) + [
        "custom_hal.hpp",
        "cvconfig.h",
        "opencl_kernels_core.hpp",
        "opencv2/opencv_modules.hpp",
        "version_string.inc",
    ],
    hdrs = ["modules/core/include/opencv2/core/opencl/ocl_defs.hpp"],
    copts = [
        "-D__OPENCV_BUILD",
        "-Iexternal/zlib",
    ],
    includes = [
        ".",
        "modules/core/include",
    ],
    linkopts = [
        "-ldl",
    ] + select({
        ":arm": ["-llog"],
        "//conditions:default": ["-lpthread"],
    }),
    visibility = ["//visibility:public"],
    deps = [
        "@zlibRepo//:zlib",
    ],
)

genrule(
    name = "opencv_core_kernels",
    outs = ["opencl_kernels_core.hpp"],
    cmd = """
      echo '#include "opencv2/core/ocl.hpp"' > $@
      echo '#include "opencv2/core/ocl_genbase.hpp"' > $@
      echo '#include "opencv2/core/opencl/ocl_defs.hpp"' > $@
    """,
)

genrule(
    name = "cvconfig",
    srcs = select({
        ":arm": ["cvconfig_android.h"],
        "//conditions:default": ["cvconfig_linux.h"],
    }),
    outs = ["cvconfig.h"],
    cmd = "cp $< $@",
)

genrule(
    name = "cvconfig_linux",
    outs = ["cvconfig_linux.h"],
    cmd = """
      echo '#define HAVE_PNG' >> $@
    """,
)

genrule(
    name = "cvconfig_android",
    outs = ["cvconfig_android.h"],
    cmd = """
      echo '#define HAVE_PNG' >> $@
      echo '#define ANDROID' >> $@
    """,
)

genrule(
    name = "custom_hal",
    outs = ["custom_hal.hpp"],
    cmd = "touch $@",
)

genrule(
    name = "version_string",
    outs = ["version_string.inc"],
    cmd = "echo '\"OpenCV 3.1.0\"' > $@",
)

genrule(
    name = "opencv_modules",
    outs = ["opencv2/opencv_modules.hpp"],
    cmd = """
        echo '#define HAVE_OPENCV_CORE' >> $@
        echo '#define HAVE_OPENCV_IMGCODECS' >> $@
        echo '#define HAVE_OPENCV_IMGPROC' >> $@
        echo '#define HAVE_OPENCV_ML' >> $@
        echo '#define HAVE_OPENCV_VIDEOIO' >> $@
    """,
)

cc_library(
    name = "opencv_imgproc",
    srcs = glob([
        "modules/imgproc/src/**/*.cpp",
        "modules/imgproc/src/**/*.hpp",
        "modules/imgproc/src/**/*.h",
        "modules/imgproc/include/**/*.hpp",
        "modules/imgproc/include/**/*.h",
    ]) + ["opencl_kernels_imgproc.hpp"],
    copts = ["-D__OPENCV_BUILD"],
    includes = [
        ".",
        "modules/core/include",
        "modules/imgproc/include",
    ],
    visibility = ["//visibility:public"],
    deps = [":opencv_core"],
)

genrule(
    name = "opencv_imgproc_kernels",
    outs = ["opencl_kernels_imgproc.hpp"],
    cmd = """
      echo '#include "opencv2/core/ocl.hpp"' > $@
      echo '#include "opencv2/core/ocl_genbase.hpp"' > $@
      echo '#include "opencv2/core/opencl/ocl_defs.hpp"' > $@
    """,
)

cc_library(
    name = "opencv_ml",
    srcs = glob([
        "modules/ml/src/**/*.cpp",
        "modules/ml/src/**/*.hpp",
        "modules/ml/include/**/*.hpp",
    ]),
    copts = ["-D__OPENCV_BUILD"],
    includes = ["modules/ml/include"],
    visibility = ["//visibility:public"],
    deps = [":opencv_core"],
)

cc_library(
    name = "opencv_imgcodecs",
    srcs = glob([
        "modules/imgcodecs/src/**/*.cpp",
        "modules/imgcodecs/src/**/*.hpp",
        "modules/imgcodecs/include/**/*.hpp",
        "modules/imgcodecs/include/**/*.h",
    ]),
    copts = [
        "-D__OPENCV_BUILD",
        "-Iexternal/libpng_http",
        "-Iexternal/libpng",
        "-Iexternal/zlib",
    ],
    includes = [
        "modules/imgcodecs/include",
    ],
    visibility = ["//visibility:public"],
    deps = [
        ":opencv_core",
        ":opencv_imgproc",
        "@libpngRepo//:libpng",
        "@zlibRepo//:zlib",
    ],
)

spd日志:

load("@rules_cc//cc:defs.bzl", "cc_library")

cc_library(
    name = "spdlog",
    hdrs = glob(["include/**/*.h"]),
    includes = ["include"],
    visibility = ["//visibility:public"],
)

libpng:

load("@rules_cc//cc:defs.bzl", "cc_library")

cc_library(
    name = "libpng",
    srcs = glob(["*.c"]), 
    hdrs = glob(["*.h"]),
    copts = [
    "-w",
    "-O3",
    "-pthread",
    "-Iexternal",
    ],
    includes = [
        ".",
    ],
    linkopts = [
        "-lpng", 
        "-lz",
    ],
    visibility = ["//visibility:public"],
    deps = [
        "@zlibRepo//:zlib",
    ],
)

z庫:

load("@rules_cc//cc:defs.bzl", "cc_library")

cc_library(
    name = "zlib",
    srcs = glob(["*.cpp"]), 
    hdrs = glob(["*.h"]),
    copts = [
    "-w",
    "-O3",
    "-pthread",
    "-Iexternal",
    ],
    visibility = ["//visibility:public"],
)

我收到一堆包含錯誤,例如:致命錯誤:找不到“pnglibconf.h”文件

據我所知,這是一個 linker 問題,其中“pnglibconf.h”應該由編譯器創建並編譯成 linker 應該能夠鏈接的庫。

特別奇怪的是,“:myAPI”是唯一的依賴項,它可以使用 g++ 正確編譯,所以一定是設置正確的鏈接選項的問題?

任何幫助將不勝感激!

謝謝,

我終於找到了解決方案:

毫不奇怪,存在不止一個問題,包括以下內容:

  1. 在編譯與我正在使用的 openCV 3.1.0 一起提供的 libpng 版本時,Emscripten 不喜歡 c++2a 標准。 因此,我最終使用 g++ 使用-std=c++2a進行編譯,而在使用 emcc (emscripten) 進行編譯時沒有使用它。

  2. 類似的情況也適用於 linker 選項,其中 g++ 需要-lpng -lz (按此順序),而 emcc 不需要任何東西。

  3. 此外,emscripten 在編譯 zlib 時需要一個 linker 標志(在我的情況下這是一個依賴項): -s USE_ZLIB=1

我希望這會有所幫助,也祝你的項目好運......

暫無
暫無

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

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