当我尝试在Linux VM上设置代码时。该库已正确安装,我可以引用它并使用C代码平稳运行。但是,当我尝试将其编译为Python ctypes使用的共享库时。编译没有像在MacOS上那样成功。编译后,我运行了python代码,它直接导致了Segmentation错误。有没有人遇到同样的问题,知道如何解决?
这是我的编译方式:
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上,我尝试了相同的编译,但失败了。
最佳答案
疯狂的活动不能代替理解。您似乎随机尝试了不同的命令行标志,并且以这种方式绊倒在正确标志上的机会很小。
您想要的正确命令行是(几乎是您拥有的):
gcc -shared -fPIC -I/home/Data/libsodium/include -o vrf.so vrf.c /home/Data/libsodium/lib/libsodium.a
请注意,
libsodim.a
必须紧随vrf.c
,因为它是how UNIX linkers work。但是,上述命令将不起作用,因为
libsodium.a
本身包含非PIC
代码。有两种方法可以解决此问题:
您可以使用
libsodium.a
标志重新构建-fPIC
,或者您可以使用
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