在绞股蓝皂苷在节点sqlite3的使用共享库(Using shared library in Gyp

2019-07-29 22:11发布

我是新来的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:未定义的符号: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。 情节复杂。 我试图通过节点的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声明没有真正发挥作用。

Answer 1:

这里的答案。

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

在使用LDD的:

〜/节点sqlite3的/生成/释放$ 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 0.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)



文章来源: Using shared library in Gyp in node-sqlite3