如何在 binding.gyp node-gyp 中为 node.js 扩展添加对静态库的依赖

Posted

技术标签:

【中文标题】如何在 binding.gyp node-gyp 中为 node.js 扩展添加对静态库的依赖【英文标题】:how to add dependence to static library in binding.gyp node-gyp for node.js extension 【发布时间】:2013-09-15 21:25:50 【问题描述】:

我有一个简单的 binding.gyp 文件来构建我的 node.js 扩展。我想改变库“mylib”的链接方法,静态链接而不是使用共享库。


  "targets": [
    
      "target_name": "myext",
      "sources": [
        "code/main.cpp",
        "code/load.cpp",
        "include/load.h"
      ],
      "include_dirs": [
        "include", "../Library/include"
      ],
      "libraries": [
        "-lmylib", "-L/home/admin/MyLib/Library/binaries/linux/Release"
      ],
      "cflags!": [ "-fno-exceptions" ],
      "cflags": [ "-std=c++11" ],
      "cflags_cc!": [ "-fno-exceptions" ]
    
  ]

mylib 的静态和共享版本在同一目录下:

# ls /home/admin/MyLib/Library/binaries/linux/Release
libmylib.a libmylib.so

我想静态链接以避免库安装/加载问题。

【问题讨论】:

【参考方案1】:

您可以让 node-gyp 使用内置变量 module_root_dir 为您插入路径 如果我正确解释了您的代码,请将您的 libraries 更改为例如:

"libraries": [
    "-lmylib",
    "-L<(module_root_dir)/../Library/binaries/linux/Release"
],

可能会成功。虽然我不确定它是否会与.a.so 版本链接,但指定您可以尝试:

"libraries": [
    "<(module_root_dir)/../Library/binaries/linux/Release/libmylib.a"
],

带有out -L 前缀和-lmylib。此外,我有点不确定是否允许您遍历根目录。我之前没有使用模块根目录上方的任何东西进行测试。除此之外,您应该一切顺利。

【讨论】:

【参考方案2】:

只需在“库”部分添加静态 .a 或 .so 文件的路径,

“库”:[“/usr/local/lib/libnetfilter_queue.so.1.3.0”]

【讨论】:

看来“库”中的路径应该是绝对路径,是这样吗? @Vimos,你可以这样写: "libraries": [ "-Wl,-rpath, mylib.a" ] 。这可以工作。

以上是关于如何在 binding.gyp node-gyp 中为 node.js 扩展添加对静态库的依赖的主要内容,如果未能解决你的问题,请参考以下文章

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

在Linux 环境 运行 node-gyp configure 出错了,在线求助

使用 node-gyp 预定义变量 PRODUCT_DIR

Nodejs 使用 addons 调用c++ 初体验

binding.gyp参数说明书/文档/指南(GYP Input Format Reference)

如何让 node-gyp 在 Windows 7 平台上工作