Я искал совсем немного, и самым близким, что я нашел к этому же вопросу, был этот (также без ответа) вопрос:
Символ не найден: _libintl_gettext
Я пытаюсь сделать тонкую оболочку с ++ для libpuzzle.
$ node --version
v0.8.18
$ npm --version
1.2.4
$ node-gyp --version
v0.8.3
Пытаюсь построить (я вручную замкнул пути с …)
$ 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)
Символ, на который жалуется Дилд: __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
, Это говорит статическому компоновщику не выдавать никаких ошибок для неопределенных символов, а вместо этого динамическому компоновщику пытаться разрешить символы во время выполнения. Это редко поведение, которое вы хотите.
Других решений пока нет …