构建时的 node-gyp 链接库依赖项

Posted

技术标签:

【中文标题】构建时的 node-gyp 链接库依赖项【英文标题】:node-gyp link library dependencies at build time 【发布时间】:2015-06-28 16:05:24 【问题描述】:

我的nodejs 插件使用cares 库,而我的binding.gyp 具有指向此的dependencies 属性。现在每当我必须运行addon 时,我都必须导出LD_LIBRARY_PATH 变量。

有没有办法可以在binding.gyp 中进行配置,这样每次我都不必设置LD_LIBRARY_PATH。 (在构建时链接)

binding.gyp 中的依赖设置:"dependencies": [ "deps/cares/cares.gyp:cares" ]

Ex 导出:export LD_LIBRARY_PATH=build/Release

【问题讨论】:

可能与***.com/a/16216870/1938163有关 @MarcoA。是的。我用相对路径和绝对路径尝试了libraries -L 选项,但没有运气:( 这是我收到的错误消息:Library not loaded: @rpath/cares.dylib 在 Mac 上 "libraries": [ "-rpath ./build/Release/" ] 为我工作,但奇怪的是它不适用于 Linux(Ubuntu)。错误消息:unrecognized command line option rpath。 Linux 中的 rpath 有什么替代方案吗? 【参考方案1】:

"libraries": [ "-Wl,-rpath,./build/Release/" ]

在 Mac 和 Linux(Ubuntu) 上为我工作。

【讨论】:

更好的"libraries": [ "-Wl,-rpath,<!(pwd)/build/Release/" ]。即使我使用 npm 安装,这也可以工作。(通过执行 pwd 自动设置绝对路径)但在 Windows 上不起作用。奇怪的预定义变量PRODUCT_DIR 对我不起作用。 "libraries": [ "-Wl,-rpath,<(PRODUCT_DIR)" ]【参考方案2】:

我已经成功地使用以下binding.gyp 行在 Ubuntu 和 Debian 中获得了相对路径:

"libraries": [ "../lib/somelib/somelib.a" ]

我的文件夹结构如下:

|--binding.gyp
|--app.cc
|--lib
   |--somelib
      |--somelib.a

我从这里得到了方法(有点间接): https://github.com/nodejs/node-gyp/issues/49

【讨论】:

【参考方案3】:

我对@9​​87654321@ 的回答似乎也适用于这里,并且应该是跨平台的。

简而言之,它使用module_root_dir 并构建一个绝对路径。 示例:

"libraries": [
    "-lcares",
    "-L<(module_root_dir)/build/Release/"
]

【讨论】:

这帮助我解决了我的问题 :-)

以上是关于构建时的 node-gyp 链接库依赖项的主要内容,如果未能解决你的问题,请参考以下文章

自定义库名称与系统库相同时的CMake循环依赖错误

即使从 package.json 中删除,node-gyp 也会尝试构建依赖项

静态库链接时的依赖关系和先后顺序

gcc 链接非标准名称库

节点 sqlite node-gyp 构建错误:“v8::Object”中没有名为“ForceSet”的成员

gcc后续——链接时的静态库和动态库