我正在将大型 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 构建是如此易于使用。我有一种强烈的感觉,我错过了别的东西。