Подчерки в именах символов при связывании с внешней библиотекой - PullRequest
0 голосов
/ 20 января 2012

Я пытаюсь скомпилировать библиотеку C, а затем ей понравился какой-то внешний код C, и у меня возникли проблемы с моим внешним кодом, находящим символы в библиотеке.Я не понимаю большой щелчок и надеюсь, что кто-то может помочь.Вот подробности:

1) Я работаю на Mac.Я скомпилировал библиотеку как статическую библиотеку .a в xcode.

2) Я пытаюсь скомпилировать функции вызова внешнего кода из библиотеки.Я включил заголовочный файл, и я указываю его местоположение и библиотеку в вызове gcc.Компиляция, кажется, завершается нормально, но не удается установить связь, указывая, что символы не могут быть найдены.

3) Отсутствующие символы перечислены как _FunctionName, где FunctionName - это имя функции, которую я вызвал.

Мне не понятно, почему компилятор / компоновщик добавил подчеркивания к именам моих функций.Но мое наивное предположение состоит в том, что символы не могут быть найдены в библиотеке.

Компиляция внешнего кода выполняется с помощью функции MATLAB mex (), которая выполняет вызовы gcc ниже в фоновом режиме.

Буду благодарен за любые мысли, которые могут возникнуть у кого-либо.

gcc-4.2 -c  -Igsf_0303/ -I/Applications/MATLAB_R2011b.app/extern/include \
-DMATLAB_MEX_FILE -fno-common -no-cpp-precomp -arch x86_64 -isysroot \
/Developer/SDKs/MacOSX10.6.sdk -mmacosx-version-min=10.5  -fexceptions  \
-DMX_COMPAT_32 -O2 -DNDEBUG  "gsf_tester.c"

gcc-4.2 -O -Wl,-twolevel_namespace -undefined error -arch x86_64 -Wl, \
-syslibroot,/Developer/SDKs/MacOSX10.6.sdk -mmacosx-version-min=10.5 -bundle -Wl,\
-exported_symbols_list,/Applications/MATLAB_R2011b.app/extern/lib/maci64/mexFunction.map \
-o  "gsf_tester.mexmaci64"  gsf_tester.o  gsf_0303/libgsf.a \
-L/Applications/MATLAB_R2011b.app/bin/maci64 -lmx -lmex -lmat -lstdc++

Undefined symbols:
  "_gsfOpen", referenced from:
      _mexFunction in gsf_tester.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

mex: link of ' "gsf_tester.mexmaci64"' failed.

1 Ответ

0 голосов
/ 20 января 2012

Вот предположение. Во-первых, комментарий Иоахима правильный. Имена функций C всегда будут начинаться с подчеркивания. Так что это не проблема.

Таким образом, либо gfsOpen() отсутствует в библиотеке, либо он не виден, либо его нельзя увидеть, когда gfs_tester.o связан.

Итак, убедитесь, что gfsOpen находится в библиотеке. Это должно сделать это

otool -t -v sgsf_0303/libgsf.a | grep gsfOpen

Вышеприведенный файл разбирает файл и затем извлекает из него интересующий вас символ. Возможно, есть лучший способ, но я не потрудился исследовать его.

Проверьте, не объявлено ли static.

Убедитесь, что архитектура библиотеки соответствует (otool -fv)

...