C语言动态库编译及遇到的问题

        仅限于学习用,不足之处,请多多指教。

        车学长今天第一次在自己的虚拟机上将几个.c和.h文件放在一起编译成动态库,当看到.so文件生成的时候,内心很激动,然后赶紧把它移到板卡上,然后修改.py代码去调用这个.so文件,结果就哦豁了,有error,解决完之后来回顾一下这个问题。

        首先,第一次编译动态库的指令及步骤如下:

                1)将编译动态库需要用到的.c和.h文件全部放到一个文件夹里;

                2)运行指令:gcc *.c -fPIC -c -I ../include/

                                     gcc -shared *.o -o libxxx.so

        把生成的xxx.so移到板卡,把xxx.so与测试代码A.py放到同一路径,然后运行指令 “python3 xxx.py

C语言动态库编译及遇到的问题_第1张图片 图1. A.py测试代码

        报以下错误:“cannot open shared object file: No such file or directory”

C语言动态库编译及遇到的问题_第2张图片 图2. 调用动态库报错

         查了一下资料,是说检测不到生成的动态库,也就是检测不到libxxx.so,很多资料都给出了解决方式,但是按目前动态库和测试代码在同一个文件夹下,调用动态库的路径也没错,是不该报这个错的。

        于是使用指令 “ldd libxxx.so” 查看动态库的依赖信息,结果如下,表示当前的动态库在当前的系统下不是动态可执行文件。

图3. 查动态库依赖的结果

         造成上面这个问题的出现是编译动态库的时候,使用的交叉编译器不对。使用指令“gcc -v”查看自己编译动态库时使用的交叉编译器的信息,发现是“x86_64-linux-gnu”,即这个交叉编译器编译出来的动态库是给x86_64的ubutnu使用的,而板卡的ubuntu是aarch64,所以会有以上报错。

图4. 虚拟机gcc版本

         使用编译器aarch64-linux-gnu-gcc重新编译动态库libxxx_1.so,将其替换libxxx.so,并修改测试代码,即可。具体指令及步骤如下:

                1)将编译动态库需要用到的.c和.h文件全部放到一个文件夹里;

                2)运行指令:aarch-linux-gnu-gcc *.c -fPIC -c -I ../include/

                                     aarch-linux-gnu-gcc -shared *.o -o libxxx_1.so

        若将动态库放于 /usr/local/lib 下,则还须在/usr/lib下创建 libxxx_1.so 的链接,或是在 /etc/ld.so.conf 文件的最后一行加上 libxxx_1.so 的路径,最后运行指令“ldconfig”,否则还是会显示找不到动态库。

        本贴仅供学习研究使用,请勿将其用作任何实际用途,否则后果自负,作者将不为其承担任何法律责任

你可能感兴趣的:(python,linux)