当我尝试在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上,我尝试了相同的编译,但失败了。
答案 0 :(得分:1)
愤怒的活动不能代替理解。您似乎会随机尝试尝试不同的命令行标志 ,但这种方法绊倒在正确标志上的可能性很小。
所需的正确命令行是(几乎是您拥有的):
- A-
请注意,gcc -shared -fPIC -I/home/Data/libsodium/include -o vrf.so vrf.c /home/Data/libsodium/lib/libsodium.a
必须紧跟libsodim.a
,因为那是how UNIX linkers work。
但是,上述命令将不起作用,因为vrf.c
本身包含非libsodium.a
代码。
有两种方法可以解决此问题:
PIC
标志重新构建libsodium.a
,或者您可以使用-fPIC
并使libsodium.so
依赖于此。假设vrf.so
中也安装了libsodium.so
,则正确的命令将是:
/home/Data/libsodium/lib
答案 1 :(得分:-1)
您缺少-c
选项。因此,GCC认为您要构建可执行文件,而不是目标文件。可执行文件需要一个main
入口点。
已修复:
gcc -c -nostartfiles -o vrf.o -I/home/Data/libsodium/include -L/home/Data/libsodium/lib vrf.c