在node-sqlite3中使用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,所以切换types为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' ] } ] }
但是,当我使用模块去运行一个程序时,我得到了
node:symbol lookup error:/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创build的可执行文件的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)
显然缺lesslibsqlite3。 所以也许我的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)