Использование общей библиотеки в Gyp в node-sqlite3

Я новичок в Джипе. Вместо компиляции моей зависимости я хотел бы использовать разделяемую библиотеку, в частности, 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? В файле binding.gyp в папке deps есть раздел, который выглядит следующим образом. Я не думаю, что мне нужен 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. Сюжет становится гуще. Я попробовал ldd для исполняемого файла, созданного node-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. Так что, возможно, мой оператор ldflags не сработал так, как планировалось.


person tofutim    schedule 14.06.2012    source источник


Ответы (1)


Вот ответ.

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

person tofutim    schedule 14.06.2012
comment
В моем случае мне нужно было добавить поддержку ssl и криптобиблиотек. Я обнаружил, что приведенный выше синтаксис от tofutim был очень полезным, за исключением одной вещи. Вместо «-lsqlite3» мне нужно было использовать «libcrypto.dylib» и «libssl.dylib». В спецификации библиотеки не было тире. Я использую Yosemite, OSX 10.10 с Xcode версии 6.1.1. - person user2246302; 12.03.2015