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

时间:2012-06-14 06:30:23

标签: node.js sqlite gyp

我是Gyp的新手。我想使用共享库,特别是已经在我的机器上的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的编译,所以切换类型到shared_library可能不是正确的答案。

'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' ]
    }
  ]
}

更新。我可以通过将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:   undefined symbol: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声明并没有真正按计划工作。

1 个答案:

答案 0 :(得分:15)

这是答案。

{
  '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)