Tôi mới sử dụng Gyp. Thay vì biên dịch sự phụ thuộc của tôi, tôi muốn sử dụng một thư viện được chia sẻ, đặc biệt là libsqlite3.so đã có trên máy của tôi. Các binding.gyp chính hiện trông giống nhưSử dụng thư viện được chia sẻ trong Gyp trong nút-sqlite3
{
'targets': [
{
'target_name': 'node_sqlite3',
'sources': [
'src/database.cc',
'src/node_sqlite3.cc',
'src/statement.cc'
],
'dependencies': [
'deps/sqlite3/binding.gyp:sqlite3'
]
}
]
}
Làm thế nào để thay đổi điều này để một thư viện sqlite3 chia sẻ được sử dụng? Binding.gyp trong thư mục deps có một phần trông giống như dưới đây. Tôi không nghĩ rằng tôi cần gyp để làm bất kỳ biên dịch của sqlite3 cho tôi, do đó, loại chuyển sang shared_library có lẽ không phải là câu trả lời đúng.
'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' ]
}
]
}
Cập nhật. tôi đã có thể có được những điều để biên dịch bằng cách thay đổi bởi binding.gyp này
{
'targets': [
{
'target_name': 'node_sqlite3',
'sources': [
'src/database.cc',
'src/node_sqlite3.cc',
'src/statement.cc'
],
'ldflags': [
'-lsqlite3'
]
}
]
}
Tuy nhiên, khi tôi đi để chạy một chương trình sử dụng các mô-đun, tôi nhận được
node: symbol lookup error: /usr/local/lib/node_modules/sqlite3/build/Release/node_sqlite3.node: undefined symbol: sqlite3_open_v2
như thể chia sẻ thư viện không tải hoặc không truy cập được. Tôi nghĩ rằng tôi gần gũi. libsqlite3 đã được cài đặt vào/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. Âm mưu dày đặc. Tôi đã thử ldd trên tệp thực thi được tạo bởi 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)
Thiếu libsqlite3 rõ ràng. Vì vậy, có lẽ tuyên bố ldflags của tôi đã không thực sự làm việc như kế hoạch.
Trong trường hợp của tôi, tôi cần thiết để hỗ trợ thêm cho ssl và crypto thư viện. Tôi thấy cú pháp ở trên từ tofutim rất hữu ích ngoại trừ một điều. Thay vì sử dụng '-lsqlite3', tôi cần sử dụng 'libcrypto.dylib' và 'libssl.dylib'. Không có dấu gạch ngang cần thiết trong đặc tả thư viện. Tôi đang sử dụng Yosemite, OSX 10.10 với phiên bản Xcode 6.1.1 – user2246302