Open
Description
Line 244 of xxhash.h has a:
#if defined (__cplusplus)
extern "C" {
#endif
that is followed up by includes of system-provided headers, that are not guaranteed to work within an extern C
linkage rules.
In particular, while compiling apache-arrow with Emscripten, I get:
/Users/carlo/emsdk/upstream/emscripten/cache/sysroot/include/emscripten/em_asm.h:151:1: error: templates must have C++ linkage
151 | template<typename, typename = void> struct __em_asm_sig {};
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/carlo/duckdb-wasm/submodules/arrow/cpp/src/arrow/vendored/xxhash/xxhash.h:173:1: note: extern "C" language linkage specification begins here
173 | extern "C" {
| ^
In file included from /Users/carlo/duckdb-wasm/submodules/arrow/cpp/src/arrow/compute/kernels/vector_hash.cc:27:
In file included from /Users/carlo/duckdb-wasm/submodules/arrow/cpp/src/arrow/array/dict_internal.h:37:
In file included from /Users/carlo/duckdb-wasm/submodules/arrow/cpp/src/arrow/util/hashing.h:49:
In file included from /Users/carlo/duckdb-wasm/submodules/arrow/cpp/src/arrow/vendored/xxhash.h:18:
In file included from /Users/carlo/duckdb-wasm/submodules/arrow/cpp/src/arrow/vendored/xxhash/xxhash.h:3434:
In file included from /Users/carlo/emsdk/upstream/emscripten/cache/sysroot/include/compat/arm_neon.h:293:
In file included from /Users/carlo/emsdk/upstream/emscripten/cache/sysroot/include/emscripten.h:1:
that make compilation fail.
Current workaround, very much ad-hoc, is explicitly including <emscripten.h>
(conditionally on EMSCRIPTEN being defined) before including xxhash.h
. This works, but it's not great and solves only this specific case. PR is at duckdb/duckdb-wasm#1803.
Would it be possible to move the includes outside of the extern C
namespace, given I believe not to be compliant with C++ compilers?
Thanks a lot.
Metadata
Assignees
Labels
No labels
Activity