在node-sqlite3中使用Gyp中的共享库

2024-03-06

我是吉普新手。我不想编译我的依赖项,而是想使用共享库,特别是我的计算机上已有的 libsqlite3.so。主要的 binding.gyp 目前看起来像

{
  'targets': [
    {
      'target_name': 'node_sqlite3',
      'sources': [
        'src/database.cc',
        'src/node_sqlite3.cc',
        'src/statement.cc'
      ],
      'dependencies': [
        'deps/sqlite3/binding.gyp:sqlite3'
      ]
    }
  ]
}

如何更改此设置以便使用共享 sqlite3 库? deps 文件夹中的 binding.gyp 有一个如下所示的部分。我认为我不需要 gyp 为我进行 sqlite3 的任何编译,因此将类型切换为共享库可能不是正确的答案。

'targets': [
    {
      'target_name': 'sqlite3',
      'type': 'static_library',
      'include_dirs': [ '.' ],
      'direct_dependent_settings': {
        'include_dirs': [ '.' ],
        'defines': [
          'SQLITE_THREADSAFE=1',
          'SQLITE_ENABLE_FTS3',
          'SQLITE_ENABLE_RTREE'
        ],
      },
      'defines': [
        '_REENTRANT=1',
        'SQLITE_THREADSAFE=1',
        'SQLITE_ENABLE_FTS3',
        'SQLITE_ENABLE_RTREE'
      ],
      'sources': [ './sqlite3.c', ],
    },

    {
      'target_name': 'shell',
      'type': 'executable',
      'dependencies': [ 'sqlite3' ],
      'sources': [ './shell.c' ]
    }
  ]
}

Update.我能够通过将 binding.gyp 更改为这个来编译东西

{
  'targets': [
    {
      'target_name': 'node_sqlite3',
      'sources': [
        'src/database.cc',
        'src/node_sqlite3.cc',
        'src/statement.cc'
      ],
      'ldflags': [
        '-lsqlite3'
      ]
    }
  ]
}

但是,当我使用该模块运行程序时,我得到

节点:符号查找错误: /usr/local/lib/node_modules/sqlite3/build/Release/node_sqlite3.node: 未定义的符号:sqlite3_open_v2

就像共享库未加载或不可访问一样。我想我已经很接近了。 libsqlite3 已安装到 /usr/local/lib

/usr/local/lib$ ls
libsqlite3.a   libsqlite3.so    libsqlite3.so.0.8.6  node_modules  python2.7
libsqlite3.la  libsqlite3.so.0  node                 pkgconfig

Update2.情节变得更加复杂。我在 node-sqlite3 创建的可执行文件上尝试了 ldd

    linux-vdso.so.1 =>  (0x00007fffd7168000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fc9451df000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fc944fc2000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc944c04000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fc94490a000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fc945704000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fc9446f4000)

显然缺少 libsqlite3。所以也许我的 ldflags 语句并没有真正按计划工作。


答案如下。

{
  'targets': [
    {
      'target_name': 'node_sqlite3',
      'sources': [
        'src/database.cc',
        'src/node_sqlite3.cc',
        'src/statement.cc'
      ],
      'link_settings': {
          'libraries': [
              '-lsqlite3'
          ]
      }
    }
  ]
}

使用 ldd 时:

〜/node-sqlite3/build/Release$ ldd node_sqlite3.node linux-vdso.so.1 => (0x00007fffe9548000)> libsqlite3.so.0 => /usr/local/lib/libsqlite3.so.0 (0x00007f6649504000)libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f66491ff000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f6648fe1000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6648c24000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f6648a20000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f6648725000) /lib64/ld-linux-x86-64.so.2 (0x00007f66499cd000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f664850f000)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在node-sqlite3中使用Gyp中的共享库 的相关文章

随机推荐

  • Restkit今天突然停止编译

    我很长一段时间以来都在我的项目中使用RestKit 使用CocoaPods Podfile pod RestKit gt 0 26 0 今天 由于未知的原因 我的项目不再编译 据我所知 我没有更改任何项目设置或任何内容 我在 RKObjec
  • CUDA 中什么样的变量会消耗寄存器?

    global void add int c const int a const int b int x blockIdx x int y blockIdx y int offset x y gridDim x c offset a offs
  • jQuery 多重选择器 + find() 与 Children()

  • 将 .NET MVC 应用程序中的 User.Identity 映射到 Active Directory 用户

    我正在编写一个 NET MVC 5 应用程序 该应用程序位于 Intranet 上 使用 Windows 身份验证 需要查询 Active Directory 以查看哪些组可用 然后检查用户是否属于该角色 组名和用户名的来源将是活动目录 然
  • 带有 eval 代码执行的heredoc

    我尝试了几种方法来尝试让它工作 但没有运气 我有一个像这样的页面 示例 h1 blah blah h1 p blah blah blah blah blah blah blah blah blah p jj 这导致没有输出什么的 想不出解决
  • Android 设备中启动任何应用程序时是否可以收到通知

    我希望当我在设备中启动任何应用程序时 它应该通知我 以编程方式 运行 启动 时是否可以收到任何应用程序的通知 您可以通过以下方式获取当前正在运行的进程ActivityManager getRunningAppProcesses http d
  • Hackage 使用哪种 Markdown 方言来呈现 README?

    Hackage 已经能够显示 Markdown 自述文件一阵子 https www well typed com blog 2015 05 recent hackage improvements 但正如人们可以看到的 例如Hackage 页
  • 为什么“a”是对象引用的 Java 字节码前缀? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 特定于类型的 Java 字节码指令具有单字符前缀来指定该指令相关的类型 Taken from Wikipedia s entry on J
  • Facebook、IE 和 P3P

    在过去的几周里 我试图找出 IE 中会话 cookie 保存的问题 我们的应用程序在 iFrame 内运行 因此 cookie 被视为第三方 我知道 IE 6 和 7 需要 P3P 标头 但出于某种原因 我仍然看到许多 IE6 7 用户从不
  • abraham 的 twitteroauth 库适用于 update_with_media 吗?

    abraham 的 twitteroauth 库适用于 update with media 吗 我正在使用下面的代码 但它返回我 stdClass 对象 请求 gt 1 statuses update with media json 错误
  • 正确的向量内存管理

    我正在制作一个游戏 我有一个子弹飞来飞去的矢量 当子弹完成后 我执行Bullets erase bullets begin i 然后子弹就消失了 然而它似乎并没有失去记忆 如果我创建 5000 颗子弹 然后在它们消失后再创建 5000 颗
  • @Mock 和 @InjectMocks 之间的区别

    有什么区别 Mock and InjectMocks在 Mockito 框架中 Mock创建一个模拟 InjectMocks创建类的实例并注入使用创建的模拟 Mock or Spy 注释到此实例中 注意你必须使用 RunWith Mocki
  • C# 中带有附加行的十字准线光标

    如何在屏幕截图上制作带有帮助线的十字准线光标 我知道如何制作十字光标 this Cursor System Windows Forms Cursors Cross 也可以是这样的 就像在 CAD 软件中一样 这是我使用的代码 x 和 y 是
  • 适用于 Android 的“实时”内存分析工具

    是否有适用于 Android 的 实时 内存分析器工具 类似于 XCode 中的 Instruments 大多数对内存分析的搜索都会引导我使用内存分析器工具 这很棒 但我非常感谢一个可以动态显示哪些类在应用程序的生命周期中消耗 和释放 内存
  • React:如何对渲染的组件的变化进行动画处理?

    我更改了通过时间间隔呈现的组件 我希望能够在每次发生变化时添加动画 最好的方法是什么 constructor props super props this state currentComponent 1 numberOfComponent
  • 将服务引用添加到 WP8 应用程序时出现问题

    我尝试添加服务引用http www webservicex com globalweather asmx WSDL网络服务 我转到 添加服务引用 它发现它很好 但是当我尝试单击 确定 时 出现错误 无法签出当前文件 该文件可能是只读的或锁定
  • JavaFX并发任务设置状态

    我正在为我的应用程序创建 UI 该应用程序与其他平台的版本共享核心模块 在JavaFX中 我尝试使用Task http docs oracle com javafx 2 api javafx concurrent Task htmls 在后
  • PHP 基于当前文件路径动态包含

    我想找到一种方法来包含基于当前文件路径的一些文件 例如 我有 website com templates name1 index php 这个 index php应该是一个独特的文件 我将在不同深度的许多不同目录中使用它 所以我想让代码通用
  • 如何使用数字字符实体而不是问号将 XmlDocument.Save() 编码为“us-ascii”?

    我的目标是获得一个二进制缓冲区 MemoryStream ToArray 会产生byte 在本例中 的 XML 且不会丢失 Unicode 字符 我希望 XML 序列化程序使用数字字符引用来表示任何在 ASCII 中无效的内容 到目前为止
  • 在node-sqlite3中使用Gyp中的共享库

    我是吉普新手 我不想编译我的依赖项 而是想使用共享库 特别是我的计算机上已有的 libsqlite3 so 主要的 binding gyp 目前看起来像 targets target name node sqlite3 sources sr