
[英]Can I link a Node.js C++ extension against Node's internal OpenSSL implementation?
[英]Link against node.js in simple c++ program
We are trying to use node.js
in a C++ project and thus cloned the nodejs/node
repository, that is linked from the Node.js documentation (chapter C++ embedder API ).
我们通过运行成功构建nodejs
:
./configure
make -j4
然后我们创建了一个简单的CMakeLists.txt
:
cmake_minimum_required(VERSION 3.23)
project(v8-cpp)
set(CMAKE_CXX_STANDARD 20)
set(NODE_DIR ${CMAKE_SOURCE_DIR}/node)
set(HEADERS
)
set(SOURCES
)
set(INCLUDE_DIRS
${NODE_DIR}/deps/v8/include/
${NODE_DIR}/deps/uv/include/
${NODE_DIR}/src/
)
add_executable(${PROJECT_NAME}
main.cpp
${HEADERS}
${SOURCES}
)
target_link_libraries(${PROJECT_NAME}
${NODE_DIR}/out/Release/libzlib.a
${NODE_DIR}/out/Release/libbase64_neon64.a
${NODE_DIR}/out/Release/libbase64.a
${NODE_DIR}/out/Release/libbrotli.a
${NODE_DIR}/out/Release/libcares.a
${NODE_DIR}/out/Release/libgtest_main.a
${NODE_DIR}/out/Release/libgtest.a
${NODE_DIR}/out/Release/libhistogram.a
${NODE_DIR}/out/Release/libicudata.a
${NODE_DIR}/out/Release/libicui18n.a
${NODE_DIR}/out/Release/libicutools.a
${NODE_DIR}/out/Release/libicuucx.a
${NODE_DIR}/out/Release/libllhttp.a
${NODE_DIR}/out/Release/libnghttp2.a
${NODE_DIR}/out/Release/libnghttp3.a
${NODE_DIR}/out/Release/libngtcp2.a
${NODE_DIR}/out/Release/libnode.a
${NODE_DIR}/out/Release/libopenssl.a
${NODE_DIR}/out/Release/libtorque_base.a
${NODE_DIR}/out/Release/libuv.a
${NODE_DIR}/out/Release/libuvwasi.a
${NODE_DIR}/out/Release/libv8_base_without_compiler.a
${NODE_DIR}/out/Release/libv8_compiler.a
${NODE_DIR}/out/Release/libv8_init.a
${NODE_DIR}/out/Release/libv8_initializers.a
${NODE_DIR}/out/Release/libv8_libbase.a
${NODE_DIR}/out/Release/libv8_libplatform.a
${NODE_DIR}/out/Release/libv8_snapshot.a
${NODE_DIR}/out/Release/libv8_zlib.a
)
target_include_directories(${PROJECT_NAME} PUBLIC
${INCLUDE_DIRS}
)
编译产生一个 linker 错误,内容如下:
Undefined symbols for architecture arm64:
"node::SnapshotBuilder::GetEmbeddedSnapshotData()", referenced from:
node::GenerateAndWriteSnapshotData(node::SnapshotData const*, node::InitializationResult const) in libnode.a(node.o)
node::LoadSnapshotDataAndRun(node::SnapshotData const*, node::InitializationResult const) in libnode.a(node.o)
node::worker::Worker::New(v8::FunctionCallbackInfo<v8::Value> const&) in libnode.a(node_worker.o)
node::contextify::ContextifyContext::ContextifyContext(node::Environment*, v8::Local<v8::Object>, node::contextify::ContextOptions const&) in libnode.a(node_contextify.o)
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Undefined symbol: node::SnapshotBuilder::GetEmbeddedSnapshotData()
我们不明白如何解决该错误,也找不到任何提示。 是否与NODE_WANT_INTERNALS
未定义有关,这会导致SnapshotBuilder
class 丢失(在node_snapshot_builder.h
中定义)?
您可能希望在没有 Node.js 自己的快照的情况下构建 Node.js。 通过--without-node-snapshot
来configure
。
./configure --without-node-snapshot
make -j4
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.