2010-11-18 4 views
0

Я пытаюсь создать общую библиотеку (действительно модуль Python), которая ссылается на статическую библиотеку. Обе библиотеки являются частью одного и того же проекта и построены с использованием cmake.CMake: Общая библиотека, использующая статическую библиотеку

Теперь общая библиотека построена так:


add_library(MyLibPython SHARED ${PYTHON_WRAPPERS_SRC}) 
set_target_properties(MyLibPython PROPERTIES PREFIX "") 
target_link_libraries(MyLibPython MyLibStatic ${LIBS}) 

Это создает без ошибок, но когда я пытаюсь импортировать модуль Python, я получаю:

 
ImportError: 
lib/python/MyLibPython.so: undefined symbol: _Zone_of_my_MyLibStatic_functions 

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

Следует добавить, что это использование gcc в Linux.

+0

Вы пытаетесь связать Повысьте :: Python статически? Или вы статически привязываетесь к обернутой библиотеке? Если первый: см. Мой ответ здесь: http://stackoverflow.com/questions/4120169/msvc-boostpython-static-linking-to-dll-pyd –

+0

Это последний. Но спасибо за ссылку, было интересно прочитать, что статическая ссылка на boost python не всегда работает ... – Krumelur

ответ

2

Проверьте командную строку компоновщика. Проходит ли что-то вроде -Wl,--as-needed? Если это так, возможно, это не будет включать все, что требуется статической библиотеке.

Я не думаю, что ваша техника переносима в целом. Можете ли вы получить доступ к общей библиотеке? Я думаю, что есть некоторые платформы, где все, что входит в общую библиотеку, должно быть скомпилировано как PIC.

Во всяком случае, чтобы связать весь архив с GNU л.д. (смотреть вверх man ld):

gcc -o foo foo.o bar.o baz.o -Wl,--whole-archive libfoo.a -Wl,--no-whole-archive [rest-of-linker-args] 
+0

К сожалению, у меня нет библиотеки shred. Я мог бы, вероятно, напрямую связать объектные файлы, но для этого требуется много переписывания скриптов сборки, и я надеялся избежать этого. – Krumelur

+0

@ Krumelur: Тем не менее, проверьте свою командную строку компоновщика. –

+0

Работает весь архив. Проблема заключается в том, что при связывании файлов .so статические библиотеки не включаются даже в том случае, если код в статической lib ссылается на него. Кажется, ld предполагает, что исполняемый файл (в данном случае, python) будет связан с теми же статическими библиотеками, что и .so. – Krumelur

Смежные вопросы