2012-06-14 30 views
5

Soy nuevo en Gyp. En lugar de compilar mi dependencia, me gustaría usar una biblioteca compartida, en particular, la libsqlite3.so que ya está en mi máquina. El principal binding.gyp actualmente pareceUso de la biblioteca compartida en Gyp en node-sqlite3

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

¿Cómo puedo cambiar esto para que se utiliza una biblioteca compartida sqlite3? El binding.gyp en la carpeta deps tiene una sección que se ve a continuación. No creo que necesite gyp para hacer ninguna compilación de sqlite3 para mí, por lo que cambiar de tipo a shared_library probablemente no sea la respuesta correcta.

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

actualización. yo era capaz de conseguir cosas para compilar cambiando por binding.gyp a este

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

Sin embargo, cuando voy a ejecutar un programa utilizando el módulo, consigo

node: symbol lookup error: /usr/local/lib/node_modules/sqlite3/build/Release/node_sqlite3.node: undefined symbol: sqlite3_open_v2

como si el compartida la biblioteca no se está cargando o no está accesible. Creo que estoy cerca. libsqlite3 fue instalado en/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. La trama se espesa. Probé LDD en el ejecutable creado por nodo-sqlite3

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 Es evidente que falta. Así que tal vez mi declaración de ldflags realmente no funcionó según lo planeado.

Respuesta

15

Aquí está la respuesta.

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

Al uso de 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)

+0

En mi caso, tenía que añadir soporte para las bibliotecas SSL y cifrado. Encontré la sintaxis anterior de tofutim fue muy útil, excepto por una cosa. En lugar de usar '-lsqlite3', necesitaba usar 'libcrypto.dylib' y 'libssl.dylib'. No se necesitó ningún guión en la especificación de la biblioteca. Estoy usando Yosemite, OSX 10.10 con Xcode versión 6.1.1 – user2246302

Cuestiones relacionadas