Проблема с подключением разделяемой библиотеки для python в Linux - PullRequest
0 голосов
/ 27 июня 2019

Пока я пытаюсь настроить свой код на Linux Linux VM.Библиотека была установлена ​​правильно, и я мог ссылаться на нее и работать с кодом Си.Тем не менее, пока я пытаюсь скомпилировать его в общую библиотеку, которая будет использоваться Python ctypes.Компиляция не была успешной, как я сделал на MacOS.После компиляции я запустил код на python, и это сразу дало ошибку сегментации.Кто-нибудь сталкивался с такой же проблемой и знает, как это исправить?

Вот как я компилирую:

gcc -nostartfiles -o vrf.o -I/home/Data/libsodium/include -L/home/Data/libsodium/lib vrf.c
gcc -shared -fPIC -I/home/Data/libsodium/include -fPIC /home/Data/libsodium/lib/libsodium.a -L/home/Data/libsodium/lib -o vrf.so vrf.c

Я пытался скомпилировать оба файла из .c или .o файла, но все не удалось.Ссылка заключалась в том, чтобы связать библиотеку со ссылкой в ​​установленном месте на /home/Data/libsodium. Пока я компилирую ее в исполняемый файл .o, linux выдает ошибку

/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status

Затем я добавил -nostartfiles, что вызвало еще однупредупреждение при компиляции в разделяемую библиотеку

warning: Cannot create .eh_frame_hdr section, --eh-frame-hdr ignored.
/usr/bin/ld: error in vrf.o(.eh_frame); no .eh_frame_hdr table will be created

Единственное отличие состоит в том, что на mac общая библиотека связана со статическим файлом .a, в то время как на linux я пробовал такую ​​же компиляцию, но она не удалась.

Ответы [ 2 ]

1 голос
/ 30 июня 2019

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

Правильная командная строка, которую вы хотите (это почти то, что вы имели):

gcc -shared -fPIC -I/home/Data/libsodium/include -o vrf.so vrf.c /home/Data/libsodium/lib/libsodium.a

Обратите внимание, что libsodim.a должен следовать vrf.c, потому что именно так работает компоновщик UNIX .

Однако указанная выше команда работать не будет, поскольку сама libsodium.a содержит не-PIC код.

Есть два способа исправить это:

  1. Вы можете перестроить libsodium.a с флагом -fPIC или
  2. Вы можете использовать libsodium.so и сделать vrf.so зависимым от этого. Предполагая, что libsodium.so также установлен в /home/Data/libsodium/lib, правильная команда для этого будет:

    gcc -shared -fPIC -I/home/Data/libsodium/include \ -L/home/Data/libsodium/lib -Wl,-rpath=/home/Data/libsodium/lib \ -o vrf.so vrf.c -lsodium

0 голосов
/ 27 июня 2019

Вам не хватает опции -c. Поэтому GCC считает, что вы хотите создать исполняемый файл, а не объектный файл; и исполняемый файл нуждается в main точке входа.

Исправлено:

gcc -c -nostartfiles -o vrf.o -I/home/Data/libsodium/include -L/home/Data/libsodium/lib vrf.c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...