node-gyp в OSX 10.7.5 — dyld: ленивая привязка символа не удалась: символ не найден

Я искал совсем немного, и самым близким, что я нашел к этому же вопросу, был этот (также без ответа) вопрос:

Символ не найден: _libintl_gettext

Я пытаюсь сделать тонкую оболочку с ++ для libpuzzle.

$ node --version
v0.8.18
$ npm --version
1.2.4
$ node-gyp --version
v0.8.3

Исходный код на GitHub

Пытаюсь построить (я вручную замкнул пути с …)

$ node-gyp clean configure build && node test.js
gyp info it worked if it ends with ok
gyp info using [email protected]
gyp info using [email protected] | darwin | x64
gyp info spawn python
gyp info spawn args [ '/opt/local/lib/node_modules/node-gyp/gyp/gyp',
gyp info spawn args   'binding.gyp',
gyp info spawn args   '-f',
gyp info spawn args   'make',
gyp info spawn args   '-I',
gyp info spawn args   '/.../node-puzzle/build/config.gypi',
gyp info spawn args   '-I',
gyp info spawn args   '/opt/local/lib/node_modules/node-gyp/addon.gypi',
gyp info spawn args   '-I',
gyp info spawn args   '/.../.node-gyp/0.8.18/common.gypi',
gyp info spawn args   '-Dlibrary=shared_library',
gyp info spawn args   '-Dvisibility=default',
gyp info spawn args   '-Dnode_root_dir=/.../.node-gyp/0.8.18',
gyp info spawn args   '-Dmodule_root_dir=/.../node-puzzle',
gyp info spawn args   '--depth=.',
gyp info spawn args   '--generator-output',
gyp info spawn args   'build',
gyp info spawn args   '-Goutput_dir=.' ]
gyp info spawn make
CXX(target) Release/obj.target/puzzle/puzzle.o
gyp info spawn args [ 'BUILDTYPE=Release', '-C', 'build' ]
SOLINK_MODULE(target) Release/puzzle.node
SOLINK_MODULE(target) Release/puzzle.node: Finished
gyp info ok
dyld: lazy symbol binding failed: Symbol not found: __Z19puzzle_init_contextP14PuzzleContext_
Referenced from: /.../node-puzzle/build/Release/puzzle.node
Expected in: dynamic lookup

dyld: Symbol not found: __Z19puzzle_init_contextP14PuzzleContext_
Referenced from: /.../node-puzzle/build/Release/puzzle.node
Expected in: dynamic lookup

Итак, эта ошибка имеет смысл для меня, очевидно, она не может загрузить динамическую библиотеку.

Сначала я подумал, что мне нужно отрегулировать binding.gyp чтобы включить параметры компоновщика, поэтому я попробовал несколько разных конфигураций. На данный момент это выглядит так:

{
"targets": [
{
"target_name": "puzzle",
"sources": [ "puzzle.cc" ],
"link_settings": {
"libraries": [
"/opt/local/lib/libgd.dylib",
"/opt/local/lib/libpuzzle.dylib"],
}
}
]
}

У меня есть библиотеки здесь:

$ ll /opt/local/lib/libpuzzle.*
-rwxr-xr-x  1 root  admin    19K Jan 30 21:24 /opt/local/lib/libpuzzle.1.dylib
-rw-r--r--  1 root  admin    20K Jan 30 21:24 /opt/local/lib/libpuzzle.a
lrwxr-xr-x  1 root  admin    17B Jan 30 21:24 /opt/local/lib/libpuzzle.dylib -> libpuzzle.1.dylib
-rwxr-xr-x  1 root  admin   1.3K Jan 30 21:24 /opt/local/lib/libpuzzle.la

$ ll /opt/local/lib/libgd.*
-rwxr-xr-x  1 root  admin   252K Sep  2 23:59 /opt/local/lib/libgd.2.dylib
-rw-r--r--  1 root  admin   289K Sep  2 23:59 /opt/local/lib/libgd.a
lrwxr-xr-x  1 root  admin    13B Sep  2 23:59 /opt/local/lib/libgd.dylib -> libgd.2.dylib
-rwxr-xr-x  1 root  admin   1.2K Sep  2 23:59 /opt/local/lib/libgd.la

Я просто не могу понять, как получить dyld чтобы увидеть их. Я пытался настроить DYLD_FRAMEWORK_PATH и DYLD_FALLBACK_LIBRARY_PATH безрезультатно.

обновление: вывод из otool

otool -l build/Release/puzzle.node

build/Release/puzzle.node:
Load command 0
cmd LC_SEGMENT_64
cmdsize 552
segname __TEXT
vmaddr 0x0000000000000000
vmsize 0x0000000000002000
fileoff 0
filesize 8192
maxprot 0x00000007
initprot 0x00000005
nsects 6
flags 0x0
Section
sectname __text
segname __TEXT
addr 0x0000000000000edc
size 0x00000000000008d8
offset 3804
align 2^2 (4)
reloff 0
nreloc 0
flags 0x80000400
reserved1 0
reserved2 0
Section
sectname __stubs
segname __TEXT
addr 0x00000000000017b4
size 0x000000000000010e
offset 6068
align 2^1 (2)
reloff 0
nreloc 0
flags 0x80000408
reserved1 0 (index into indirect symbol table)
reserved2 6 (size of stubs)
Section
sectname __stub_helper
segname __TEXT
addr 0x00000000000018c4
size 0x000000000000021c
offset 6340
align 2^2 (4)
reloff 0
nreloc 0
flags 0x80000400
reserved1 0
reserved2 0
Section
sectname __cstring
segname __TEXT
addr 0x0000000000001ae0
size 0x00000000000001ea
offset 6880
align 2^0 (1)
reloff 0
nreloc 0
flags 0x00000002
reserved1 0
reserved2 0
Section
sectname __unwind_info
segname __TEXT
addr 0x0000000000001cca
size 0x000000000000008c
offset 7370
align 2^0 (1)
reloff 0
nreloc 0
flags 0x00000000
reserved1 0
reserved2 0
Section
sectname __eh_frame
segname __TEXT
addr 0x0000000000001d58
size 0x00000000000002a8
offset 7512
align 2^3 (8)
reloff 0
nreloc 0
flags 0x00000000
reserved1 0
reserved2 0
Load command 1
cmd LC_SEGMENT_64
cmdsize 472
segname __DATA
vmaddr 0x0000000000002000
vmsize 0x0000000000001000
fileoff 8192
filesize 4096
maxprot 0x00000007
initprot 0x00000003
nsects 5
flags 0x0
Section
sectname __dyld
segname __DATA
addr 0x0000000000002000
size 0x0000000000000010
offset 8192
align 2^3 (8)
reloff 0
nreloc 0
flags 0x00000000
reserved1 0
reserved2 0
Section
sectname __got
segname __DATA
addr 0x0000000000002010
size 0x0000000000000010
offset 8208
align 2^3 (8)
reloff 0
nreloc 0
flags 0x00000006
reserved1 45 (index into indirect symbol table)
reserved2 0
Section
sectname __la_symbol_ptr
segname __DATA
addr 0x0000000000002020
size 0x0000000000000168
offset 8224
align 2^3 (8)
reloff 0
nreloc 0
flags 0x00000007
reserved1 47 (index into indirect symbol table)
reserved2 0
Section
sectname __data
segname __DATA
addr 0x0000000000002190
size 0x0000000000000060
offset 8592
align 2^4 (16)
reloff 0
nreloc 0
flags 0x00000000
reserved1 0
reserved2 0
Section
sectname __const
segname __DATA
addr 0x00000000000021f0
size 0x0000000000000030
offset 8688
align 2^4 (16)
reloff 0
nreloc 0
flags 0x00000000
reserved1 0
reserved2 0
Load command 2
cmd LC_SEGMENT_64
cmdsize 72
segname __LINKEDIT
vmaddr 0x0000000000003000
vmsize 0x0000000000002000
fileoff 12288
filesize 6648
maxprot 0x00000007
initprot 0x00000001
nsects 0
flags 0x0
Load command 3
cmd LC_ID_DYLIB
cmdsize 48
name @rpath/puzzle.node (offset 24)
time stamp 1 Wed Dec 31 19:00:01 1969
current version 0.0.0
compatibility version 0.0.0
Load command 4
cmd LC_SYMTAB
cmdsize 24
symoff 12720
nsyms 138
stroff 15344
strsize 3592
Load command 5
cmd LC_DYSYMTAB
cmdsize 80
ilocalsym 0
nlocalsym 76
iextdefsym 76
nextdefsym 19
iundefsym 95
nundefsym 43
tocoff 0
ntoc 0
modtaboff 0
nmodtab 0
extrefsymoff 0
nextrefsyms 0
indirectsymoff 14976
nindirectsyms 92
extreloff 14928
nextrel 6
locreloff 12288
nlocrel 50
Load command 6
cmd LC_UUID
cmdsize 24
uuid 9A75E329-2D02-3AC8-A249-A741702EB141
Load command 7
cmd LC_VERSION_MIN_MACOSX
cmdsize 16
version 10.5
sdk 10.7
Load command 8
cmd LC_LOAD_DYLIB
cmdsize 64
name /opt/local/lib/libssl.1.0.0.dylib (offset 24)
time stamp 2 Wed Dec 31 19:00:02 1969
current version 1.0.0
compatibility version 1.0.0
Load command 9
cmd LC_LOAD_DYLIB
cmdsize 64
name /opt/local/lib/libcrypto.1.0.0.dylib (offset 24)
time stamp 2 Wed Dec 31 19:00:02 1969
current version 1.0.0
compatibility version 1.0.0
Load command 10
cmd LC_LOAD_DYLIB
cmdsize 56
name /opt/local/lib/libgd.2.dylib (offset 24)
time stamp 2 Wed Dec 31 19:00:02 1969
current version 3.0.0
compatibility version 3.0.0
Load command 11
cmd LC_LOAD_DYLIB
cmdsize 64
name /opt/local/lib/libpuzzle.1.dylib (offset 24)
time stamp 2 Wed Dec 31 19:00:02 1969
current version 2.0.0
compatibility version 2.0.0
Load command 12
cmd LC_LOAD_DYLIB
cmdsize 56
name /usr/lib/libstdc++.6.dylib (offset 24)
time stamp 2 Wed Dec 31 19:00:02 1969
current version 52.0.0
compatibility version 7.0.0
Load command 13
cmd LC_LOAD_DYLIB
cmdsize 56
name /usr/lib/libSystem.B.dylib (offset 24)
time stamp 2 Wed Dec 31 19:00:02 1969
current version 159.1.0
compatibility version 1.0.0
Load command 14
cmd LC_LOAD_DYLIB
cmdsize 56
name /usr/lib/libgcc_s.1.dylib (offset 24)
time stamp 2 Wed Dec 31 19:00:02 1969
current version 1094.0.0
compatibility version 1.0.0
Load command 15
cmd LC_FUNCTION_STARTS
cmdsize 16
dataoff 12688
datasize 32
Load command 16
cmd LC_DATA_IN_CODE
cmdsize 16
dataoff 12720
datasize 0

otool -L build/Release/puzzle.node

build/Release/puzzle.node:
@rpath/puzzle.node (compatibility version 0.0.0, current version 0.0.0)
/opt/local/lib/libssl.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
/opt/local/lib/libcrypto.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
/opt/local/lib/libgd.2.dylib (compatibility version 3.0.0, current version 3.0.0)
/opt/local/lib/libpuzzle.1.dylib (compatibility version 2.0.0, current version 2.0.0)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 52.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1094.0.0)

6

Решение

Символ, на который жалуется Дилд: __Z19puzzle_init_contextP14PuzzleContext_, В своей неукротимой форме это puzzle_init_context(PuzzleContext_*), Мангл указывает на то, что компилятор считал его символом C ++. Тем не менее, libpuzzle, похоже, экспортирует чистый C-интерфейс. Это означает, что символ это должен искать это _puzzle_init_context, Вы можете исправить это, обернув #include <puzzle.h> в extern "C" { … } блок для информирования компилятора о том, что содержимое заголовка должно рассматриваться как код C, поэтому он будет обрабатывать имена символов по соответствующим правилам.

Этот тип ошибки обычно обнаруживается статическим компоновщиком, а не динамическим компоновщиком во время выполнения. Expected in: dynamic lookup часть вашего сообщения об ошибке указывает на то, что puzzle.node был связан с -undefined dynamic_lookup, Это говорит статическому компоновщику не выдавать никаких ошибок для неопределенных символов, а вместо этого динамическому компоновщику пытаться разрешить символы во время выполнения. Это редко поведение, которое вы хотите.

7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]