1

我正在将大型 C++ 代码从 Windows 移植到 linux。一部分由一些包含节点插件的共享库组成。我的代码编译得很好,但是在链接到 node.js 时出现了数千个错误。

我重新编译了节点,在 common.gypi 文件中添加了 -fPIC 标志。在发布部分我添加了

'cflags': [ '-O3', '-fPIC' ],

我链接到 cmake 文件中的节点:

target_link_libraries(${PROJECT_NAME} ${NODELIBLOCATION}/libnode.a )

我这样做是因为我将静态节点库链接到共享库。就像我说的那样,找到了标头并且一切都编译得很好,但是在链接时我得到了所有类型的错误,这些错误涉及到缺少 v8 组件,例如:

node_errors.cc:(.text+0x84): undefined reference to `v8::Context::GetNumberOfEmbedderDataFields()'

所有错误都来自属于节点的文件。node_errors.cc、js_native_api_v8.cc 等等。所有错误均涉及 v8:: 组件。

我会说我缺少另一个要链接的库,但 windows 项目只链接到节点。也许我缺少一个链接到静态库的标志?

编辑:我尝试链接到已编译的其他库(并且我希望捆绑在 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 构建是如此易于使用。我有一种强烈的感觉,我错过了别的东西。

4

1 回答 1

0

答案是(正如@Botje 建议的那样)将节点构建为共享库。

我曾尝试编译一个修改 common.gypi 文件的共享库,该文件有一个定义输出类型的变量,但这不起作用。文档中也没有关于如何将节点编译为共享库的信息。这个 SO 有答案:How to build nodejs as a shared library from source code

基本上只是做

    ./configure --shared
于 2020-10-21T09:25:48.863 回答