如何 link libnode.a 到 linux 中的共享库
How to link libnode.a to a shared library in linux
我正在将大型 C++ 代码从 windows 移植到 linux。一部分由一些包含节点插件的共享库组成。我的代码编译得很好,但是当 linking 到 node.
时我遇到了数千个错误
我重新编译了节点,在 common.gypi 文件中添加了 -fPIC 标志。在发布部分我添加了
'cflags': [ '-O3', '-fPIC' ],
我link到cmake文件中的节点:
target_link_libraries(${PROJECT_NAME} ${NODELIBLOCATION}/libnode.a )
我这样做是因为我要将静态节点库 link 连接到共享库。就像我说的,找到 headers 并且一切都可以正常编译,但是当 linking 时,我会收到所有类型的错误,指的是缺少 v8 组件,例如:
node_errors.cc:(.text+0x84): undefined reference to `v8::Context::GetNumberOfEmbedderDataFields()'
所有错误都来自属于节点的文件。 node_errors.cc、js_native_api_v8.cc 等等。所有错误均参考 v8:: components.
我会说我缺少 link 的另一个库,但是 windows 项目只有 link 节点。也许我缺少 link 到静态库的标志?
编辑:
我尝试 linking 到其他编译的库(我希望被捆绑在 libnode 中)。我得到的错误少了很多,但仍然有很多。我的部分 cmake 文件看起来像这样:
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libnode.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libnode_text_start.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libuvwasi.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libuv.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libnghttp2.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libhttp_parser.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libllhttp.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libbrotli.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libcares.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libhistogram.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libtorque_base.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libv8_base_without_compiler.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libv8_init.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libv8_initializers.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libv8_libplatform.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libv8_libsampler.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libv8_nosnapshot.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libv8_snapshot.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libv8_libbase.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libv8_compiler.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libicui18n.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libicudata.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libicustubdata.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libicuucx.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libopenssl.a )
也许我弄错了顺序,但我觉得这样是不对的,而 windows 版本是如此易于使用。我有一种强烈的感觉,我还缺少其他东西。
答案是(如@Botje 建议的那样)将节点构建为共享库。
我曾尝试编译一个修改 common.gypi 文件的共享库,该文件有一个定义输出类型的变量,但这没有用。文档中也没有关于如何将节点编译为共享库的信息。这个 SO 有答案:How to build nodejs as a shared library from source code
基本上就做
./configure --shared
我正在将大型 C++ 代码从 windows 移植到 linux。一部分由一些包含节点插件的共享库组成。我的代码编译得很好,但是当 linking 到 node.
时我遇到了数千个错误我重新编译了节点,在 common.gypi 文件中添加了 -fPIC 标志。在发布部分我添加了
'cflags': [ '-O3', '-fPIC' ],
我link到cmake文件中的节点:
target_link_libraries(${PROJECT_NAME} ${NODELIBLOCATION}/libnode.a )
我这样做是因为我要将静态节点库 link 连接到共享库。就像我说的,找到 headers 并且一切都可以正常编译,但是当 linking 时,我会收到所有类型的错误,指的是缺少 v8 组件,例如:
node_errors.cc:(.text+0x84): undefined reference to `v8::Context::GetNumberOfEmbedderDataFields()'
所有错误都来自属于节点的文件。 node_errors.cc、js_native_api_v8.cc 等等。所有错误均参考 v8:: components.
我会说我缺少 link 的另一个库,但是 windows 项目只有 link 节点。也许我缺少 link 到静态库的标志?
编辑: 我尝试 linking 到其他编译的库(我希望被捆绑在 libnode 中)。我得到的错误少了很多,但仍然有很多。我的部分 cmake 文件看起来像这样:
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libnode.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libnode_text_start.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libuvwasi.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libuv.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libnghttp2.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libhttp_parser.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libllhttp.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libbrotli.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libcares.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libhistogram.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libtorque_base.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libv8_base_without_compiler.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libv8_init.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libv8_initializers.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libv8_libplatform.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libv8_libsampler.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libv8_nosnapshot.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libv8_snapshot.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libv8_libbase.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libv8_compiler.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libicui18n.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libicudata.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libicustubdata.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libicuucx.a )
target_link_libraries(${PROJECT_NAME} ${NODELIBDIR}libopenssl.a )
也许我弄错了顺序,但我觉得这样是不对的,而 windows 版本是如此易于使用。我有一种强烈的感觉,我还缺少其他东西。
答案是(如@Botje 建议的那样)将节点构建为共享库。
我曾尝试编译一个修改 common.gypi 文件的共享库,该文件有一个定义输出类型的变量,但这没有用。文档中也没有关于如何将节点编译为共享库的信息。这个 SO 有答案:How to build nodejs as a shared library from source code
基本上就做
./configure --shared