2012-06-14 6 views
5

Ich bin neu bei Gyp. Anstatt meine Abhängigkeit zu kompilieren, möchte ich eine gemeinsam genutzte Bibliothek verwenden, insbesondere die libsqlite3.so, die sich bereits auf meinem Rechner befindet. Der Haupt binding.gyp sieht derzeit wieShared Library in Gyp in node-sqlite3 verwenden

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

Wie kann ich das ändern, so dass eine gemeinsame sqlite3 Bibliothek verwendet wird? Die Datei binding.gyp im Ordner deps hat einen Abschnitt, der wie folgt aussieht. Ich glaube nicht, dass ich gyp brauche, um sqlite3 für mich zu kompilieren, daher ist das Umschalten auf shared_library wahrscheinlich nicht die richtige Antwort.

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

Aktualisierung. ich in der Lage war, die Dinge zu bekommen, indem von binding.gyp diese

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

jedoch zu kompilieren, wenn ich ein Programm, mit dem Modul gehen zu laufen, bekomme ich

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

als ob die gemeinsamen Die Bibliothek lädt nicht oder ist nicht zugänglich. Ich denke ich bin nah dran. libsqlite3 wurde nach/usr/local/lib

installiert
/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. Die Handlung verdichtet sich. Ich habe versucht, ldd auf die ausführbare Datei von Knoten-sqlite3 erstellt

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) 

Offensichtlich fehlt libsqlite3. Vielleicht funktionierte meine ldflags-Aussage nicht wirklich wie geplant.

Antwort

15

Hier ist die Antwort.

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

Bei der Verwendung von 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

In meinem Fall musste ich die Unterstützung für ssl und Krypto-Bibliotheken hinzuzufügen. Ich fand die obige Syntax von Tofutim sehr hilfreich, bis auf eine Sache. Anstatt '-lsqlite3' zu verwenden, musste ich 'libcrypto.dylib' und 'libssl.dylib' verwenden. In der Bibliotheksspezifikation wurde kein Bindestrich benötigt. Ich verwende Yosemite, OSX 10.10 mit Xcode Version 6.1.1 – user2246302