如何在Linux中将libnode.a链接到共享库

问题描述

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

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

time_stamp  sales_quantity
2020-01-14  1100
2020-01-15  1240

链接到cmake文件中的节点:

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

之所以这样做,是因为我将静态节点库链接到共享库。就像我说的,可以找到标头,并且一切都可以正常编译,但是在链接时,我遇到了各种错误,这些错误指的是缺少v8组件,例如:

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

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

我想说的是我缺少另一个链接的库,但是Windows项目仅链接到node。也许我缺少链接到静态库的标志?

编辑: 我尝试链接到其他已编译的库(并且我希望将其捆绑在libnode中)。我得到的错误更少,但仍然有很多错误。我的cmake文件的一部分看起来像这样:

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

也许我弄错了顺序,但是当Windows构建非常易于使用时,这是一种错误的做法。我很想念其他东西。

解决方法

答案是(按照@Botje的建议)将节点构建为共享库。

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

基本上只是做

    ./configure --shared