这里:
gcc -L/usr/local/lib -lgmp -lpaillier `mysql_config --cflags` -c -fPIC #{FILE}.c
您正在编译一个目标文件,其名称将是 #{FILE}.o 的值 -
假设它是aa.o - 您正在使用与位置无关的代码编译它
(-fPIC)。您的链接器标志:
-L/usr/local/lib -lgmp -lpaillier
这里没有任何作用,因为没有进行链接而被忽略。
这里:
ar -x /usr/local/lib/libpaillier.a
您正在从静态库/usr/local/lib/libpaillier.a 中提取所有目标文件。其实只有
库中的一个目标文件,paillier.o
这里:
gcc -shared *.o -L/usr/lib/x86_64-linux-gnu/ -lgmp -o #{LIBFILE}
您正在构建一个共享库,其名称将是 #{LIBFILE} 的值
- 假设它是libfoo.so - 链接目标文件aa.o, paillier.o,
加上libgmp。
从libpaillier.a 中提取目标文件paillier.o 以将其与libfoo.so 链接
与 not 提取它并简单地链接没有什么不同
libpaillier.a 本身,即与:
gcc -shared #{FILE}.o -L/usr/local/lib -lpaillier -L/usr/lib/x86_64-linux-gnu/ -lgmp -o #{LIBFILE}
以及链接库路径:
-L/usr/local/lib -L/usr/lib/x86_64-linux-gnu/
是多余的,因为这两个路径都是系统上的默认链接器搜索路径。
但共享库必须完全由 PIC 目标代码构建。 aa.o 已编译
与-fPIC,在您的第一步。但是,paillier.o 并非如此。所以链接失败并且链接器
建议你paillier.o必须用-fPIC重新编译。
那就这样吧:-
删除您现有的/usr/local/lib/libpaillier.a 和/usr/local/include/paillier.h
回到你的 libpaillier 源目录(你第一次构建它的地方)。
清理一下:
$ make clean
重新配置 autotools 构建系统以编译 PIC 代码:
$ ./configure CFLAGS=-fPIC [and whatever other options you used before]
重建:
$ make
重新安装:
$ sudo make install
现在你又多了一个标题/usr/local/include/paillier.h 和
一个静态库/usr/local/lib/libpaillier.a 但这次
库中的paillier.o是PIC代码。
然后您可以使用以下方法构建您的插件:
task :compile do
system("gcc `mysql_config --cflags` -c -fPIC #{FILE}.c")
system("gcc -shared #{FILE}.o -lpaillier -lgmp -o #{LIBFILE}")
system("sudo mv #{LIBFILE} /usr/lib/mysql/plugin/")
end