Я пытаюсь построить расширение Python на MacOSX 10.6 и связать его с несколькими фреймворками (только для i386). Я создал файл setup.py, используя distutils и объект Extension.
Я заказываю ссылку на мои фреймворки, мой LDFLAGS env var должен выглядеть так:
LDFLAGS = -lc -arch i386 -framework fwk1 -framework fwk2
Поскольку я не нашел ни одного ключевого слова framework в документации модуля расширения, вместо этого я использовал ключевое слово extra_link_args .
Extension('test',
define_macros = [('MAJOR_VERSION', '1'), ,('MINOR_VERSION', '0')],
include_dirs = ['/usr/local/include', 'include/', 'include/vitale'],
extra_link_args = ['-arch i386',
'-framework fwk1',
'-framework fwk2'],
sources = "testmodule.cpp",
language = 'c++' )
Все прекрасно компилируется и связывается. Если я удалю строку -framework из extra_link_args, мой компоновщик завершится неудачно, как и ожидалось. Вот две последние строки, созданные в сборке python setup.py:
/usr/bin/g++-4.2 -arch x86_64 -arch i386 -isysroot /
-L/opt/local/lib -arch x86_64 -arch i386 -bundle
-undefined dynamic_lookup build/temp.macosx-10.6-intel-2.6/testmodule.o
-o build/lib.macosx-10.6-intel-2.6/test.so
-arch i386 -framework fwk1 -framework fwk2
К сожалению, только что созданный файл .so не может найти несколько символов, предоставляемых этим фреймворком. Я пытался проверить связанные рамки с otool. Ни один из них не появляется.
$ otool -L test.so
test.so:
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.0.1)
Вывод otool, запущенного в тестовом двоичном файле, сделан с использованием g ++ и ldd с использованием LDFLAGS, описанных в начале моего поста. В этом примере -framework сработал.
$ otool -L vitaosx
vitaosx:
/Library/Frameworks/fwk1.framework/Versions/A/fwk1 (compatibility version 1.0.0, current version 1.0.0)
/Library/Frameworks/fwk2.framework/Versions/A/fwk2 (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.0.1)
Может ли эта проблема быть связана с флагом -undefined dynamic_lookup на шаге связывания? Меня немного смущают несколько строк документации, которые я нахожу в Google.
Приветствия