1、对于python,ctypes只能load动态库,但现在我的对象是一个静态库,而且我没有源代码,静态库在编译过程中没有加--fPIC参数,
所以我也没办法将其编译为动态库,有没有什么方法在python里可以调用静态库的函数?

  答案:静态库.a 如果编译时没有加-fPIC参数,需要加上-fPIC重新编译生成,然后可以被c++/c程序引用,并编译生成共享库.so,被python调用。g++ 编译生成方式如下:

g++ -shared -fPIC -o libmyAPI.so myAPI.o

g++ slamdata_for_py.cpp -shared -fPIC -o slamdata_for_py.so -std=c++ -I/opt/fp100/slam_ws/slamware_sdk_linux-aarch64-gcc4./linux-aarch64-release/include -L/opt/fp100/slam_ws/slamware_sdk_linux-aarch64-gcc4./linux-aarch64-release/lib -lstdc++ -ldl -lrt -lm -lpthread -lrpos_framework -lrpos_robotplatforms_rpslamware -lboost_atomic -lboost_atomic -lboost_date_time -lboost_regex -lboost_system -lboost_thread -lboost_filesystem -lboost_random -lbase64 -ljsoncpp -lrlelib -lcrypto -lcurl -lssl

g++ testpy.cpp  -fPIC -shared -o libtest.so -std=c++

g++ test.cpp -std=c++ -o test -I/opt/fp100/slam_ws/slamware_sdk_linux-aarch64-gcc4./samples/slamapipy/include -I/opt/fp100/slam_ws/slamware_sdk_linux-aarch64-gcc4./linux-aarch64-release/include -L/opt/fp100/slam_ws/slamware_sdk_linux-aarch64-gcc4./linux-aarch64-release/lib -L../ -lslamapipy -lstdc++ -ldl -lrt -lm -lpthread -lrpos_framework -lrpos_robotplatforms_rpslamware -lboost_atomic -lboost_atomic -lboost_date_time -lboost_regex -lboost_system -lboost_thread -lboost_filesystem -lboost_random -lbase64 -ljsoncpp -lrlelib -lcrypto -lcurl -lssl

2、不同编译器涉及到binutils 版本不同,在开发板上调整binutils 版本:

  第一、去下载源码包
    点击该网页http://ftp.gnu.org/gnu/binutils/ , 选择一个相应的版本xxx
    wget http://ftp.gnu.org/gnu/binutils/xxx
  第二、 安装
    ./configure  -disable-werror
    make && make install
 
3、共享库编译与运行
编译共享库:
gcc -o libdl_func.so -fPIC -rdynamic -shared dl_func.c
选项-fPIC指示编译器将代码编译成位置独立的代码,一般需要以程序文件共享其函数或变量给其他程序文件的代码都应该以此选项进行编译,选项-rdynamic指示编译器所编译/链接的为共享库程序文件。由于要使用外部变量,因此需要-shared选项,否则编译器会抛出错误信息:undefined reference to `name',表示不能找到name变量。
编译事例程序:
gcc -o dl_demo1 -L./ -ldl_func dl_demo1.c
选项-L./ 指示编译器在当前目录下寻找共享库文件,-ldl_func指示需要的共享库文件名为libdl_func.so。
运行:
./dl_demo1
 
4、cmake 指定gcc/g++的版本进行程序编译生成
 
cmake 指定gcc/g++版本 :
export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++
cmake /path/to/your/project
make

5、虚拟机交叉编译环境搭建:

sudo add-apt-repository ppa:linaro-maintainers/toolchain
sudo apt-get update
sudo apt-get install gcc-**version**-aarch64-linux-gnu sudo apt-cache search aarch64
查看哪些版本可以安装; sudo apt-get install gcc-4.8-aarch64-linux-gnu
安装一个gcc开头的4.8版本的支持64bit ARM linux的交叉编译工具; sudo apt-get install gcc-aarch64-linux-gnu
然后再安装一个没有版本号的gcc-aarch64-linux-gnu; sudo apt-get install g++-4.8-aarch64-linux-gnu
sudo apt-get install g++-aarch64-linux-gnu

以上步骤是安装支持ARM64位系统的交叉编译工具,
安装之后,用aarch64-linux-gnu-gcc -v可以查看里边的版本信息,里边有host是什么,target是什么。

6、.so 动态库  undefined symbol

1、首先排查,C++调用了c的库?是不是需要加上extern "c",尤其是类的动态库,需要用到工厂模式,create一个对象出来,该工厂函数需要extern "c"声明。
extern "C" CDbBase* create();
extern "C" void destroy(CDbBase* p);
--
CDbBase* create()
{return new CDbDb2;
}
void destroy(CDbBase* p)
{printf("destroy CDbDb2!\n");
delete p;
} 2、使用ldd -r xxx.so或者 nm -A xxx.so等命令,查看so有哪些符号未定义的。 3、在步骤2发现有很多未定义的符号,跟运行时undefined symbol符合,而且该符号是外部的系统的动态库里定义的,那目标就定位到自己写的动态库里,链接的过程时,是否把这些动态库给链接进来。
查找发现makefile编译动态库时,找不到链接符号也是允许编译通过的,那最好是加上限制条件,在makefile加上 -Xlinker --unresolved-symbols=ignore-in-shared-libs ,让其报错,把未定义的符号给报错出来。 4、根据makefile的报错,原来是忘了把外部动态库给 -l进来,并把动态库路径-L进来,即可。 makefile中没有指定对应的静态库

makefile 中修改实现:

HOME_TREE := ../../
#CURDIR是make的内嵌变量,自动设置为当前目彿 notdir -Xlinker --unresolved-symbols=ignore-in-shared-libs -shared -fPIC
MODULE_NAME := $(notdir $(CURDIR)) #CC = aarch64-linux-gnu-gcc
#CXX = aarch64-linux-gnu-g++ CC = gcc
CXX = g++ OBJS := slamdata_for_py.o houghlines.o
SRCS =
CXXSRC := src/slamdata_for_py.cpp src/houghlines.cpp
INCLUDE := -I./include -I. -I$(HOME_TREE)/linux-aarch64-release/include INCLUDE += $(shell pkg-config --cflags opencv)
OPENCV_LIBS = $(shell pkg-config --libs opencv) CFLAGS = -Wall -g -O -fPIC ###需要加-fPIC
CXXFLAGS = -std=c++ -shared -fPIC -Xlinker --unresolved-symbols=ignore-in-shared-libs #LDFLAGS := -static
LD_LIBS = -Xlinker "-(" \
-lstdc++ -ldl -lrt -lm -lpthread \
-lrpos_framework -lrpos_robotplatforms_rpslamware \
-lboost_atomic \
-lboost_chrono \
-lboost_date_time \
-lboost_regex \
-lboost_system \
-lboost_thread \
-lboost_filesystem \
-lboost_random \
-lbase64 \
-ljsoncpp \
-lrlelib \
-lcrypto \
-lcurl \
-lssl \
-Xlinker "-)" \ LDFLAGS += -L$(HOME_TREE)/linux-aarch64-release/lib $(LD_LIBS) $(OPENCV_LIBS) TARGET = libslamapipy.so
LIBPATH = ./libs/ vpath %.h ./include $(HOME_TREE)/linux-aarch64-release/include all:$(TARGET) $(OBJS):$(CXXSRC)
$(CXX) -std=c++ $(INCLUDE) -c -fPIC $^ $(TARGET):$(OBJS)
$(CXX) $(CXXFLAGS) $(OBJS) -o $(TARGET) $(LDFLAGS) clean:
rm -f *.o
rm -f *.so
rm -f $(LIBPATH)*

生成.so共享库一定不要静态链接(makefile 红字部分)。-Xlinker  可以解决库库之间相互依赖顺序问题。

python调用c++/c 共享库,开发板上编译的一些坑!的更多相关文章

  1. python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码

    python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码 淘宝IP地址库 http://ip.taobao.com/目前提供的服务包括:1. 根据用户提供的 ...

  2. ARM开发板上查看动态库或者可执行程序的依赖关系

    以ARM32开发板为例,在/lib下有一个名为ld-linux-armhf.so.3的可执行程序(在ARM64开发板上是/lib/ld-linux-aarch64.so.1),这个程序负责加载可执行程 ...

  3. 【开发实录】在鸿蒙开发板上使用websocket(移植自librws库)

    librws: Tiny, cross platform websocket client C library 相关代码可在下面下载,也可进入librws: 将librws移植到鸿蒙Hi_3861开发 ...

  4. 【Android 系统开发】 编译 Android文件系统 u-boot 内核 并烧写到 OK-6410A 开发板上

    博客地址 : http://blog.csdn.net/shulianghan/article/details/40299813  本篇文章中用到的工具源码下载 : -- ok-6410A 附带的 A ...

  5. easycwmp在开发板上的配置

    原创作品,转载请注明出处 copyright:weishusheng   2015.3.18 email:642613208@qq.com 平台: Linux version 2.6.32-279.e ...

  6. FS210开发板上Qt4.7.0移植过程

    作者:冯老师,华清远见嵌入式学院讲师. 1. 搭建Qt开发环境平台 1.开发环境:ubuntu 12.04 2.交叉编译链:arm-cortex_a8-linux-gnueabi 3.开发板:FS21 ...

  7. 开发板上使用core文件调试

    转载:http://www.nginx.cn/1521.html 如果开发板的操作系统也是linux,core调试方法依然适用.如果开发板上不支持gdb,可将开发板的环境(依赖库).可执行文件和cor ...

  8. 交叉编译环境以及开发板上-/bin/sh: ./hello: not found 转载自 http://blankboy.72pines.com

    交叉编译环境以及开发板上-/bin/sh: ./hello: not found 目标板是S3C2440.至于交叉编译环境的搭建就不多说了,网上很多教程. 搭建好了交叉编译环境后,第一件事就是传说中的 ...

  9. 02.将uboot,kernel,rootfs下载到开发板上

    转载,侵删 将uboot,kernel,rootfs下载到开发板上 1.为什么要下载 所谓下载,也称烧录,部署. 1.1.什么是u-boot Hi3518EV200 单板的 Bootloader 采用 ...

随机推荐

  1. qt对plot柱状图颜色设置

      当使用qwtplotbarchart来使用柱状图时.可以通过下面代码来设置柱状图的颜色 QwtPlotBarChart  *barChart = new QwtPlotBarChart(" ...

  2. EditPlus 好看的monaco主题

    版本: editplus 4.3效果图:-------- 在editplus配置目录下,找到editplus_u.ini,替换为以下代码:------------------------------- ...

  3. js 继承,Object.setPrototypeOf | Object.getPrototypeOf | Object.create class

    https://juejin.im/post/5cfd9d30f265da1b94213d28#heading-14 https://juejin.im/post/5d124a12f265da1b91 ...

  4. css实现div水平垂直居中

    中秋快到了,祝大家中秋快乐. 平时大家写bug过程中肯定会遇到让div框水平或者垂直居中,然而有时候能居中,有时候不能居中.我把平时遇到的一些方法写出来,如果对你有用,那便是晴天. 1.text-al ...

  5. js获取两个经纬度之间的角度(0度-360度)

    /** * 获取角度 */mapNumberUtil.getAngle = function(lng_a,lat_a, lng_b, lat_b){ var a = (90 - lat_b) * Ma ...

  6. Malloc与Free不调用构造函数与析构函数

    例子: #include "stdafx.h" #include <new> #include <iostream> using namespace std ...

  7. Codeforces Round #575 (Div. 3) E. Connected Component on a Chessboard(思维,构造)

    E. Connected Component on a Chessboard time limit per test2 seconds memory limit per test256 megabyt ...

  8. PHP漏洞函数

    1. is_numeric函数 bool is_numeric ( mixed $var ) 此函数用于判断变量是否数字或者数字字符串,不仅能接受十进制,还能接受十六进制,这样就有了绕过的方法 < ...

  9. Mysql中event事件的入门

    Mysql中event事件的入门 主要涉及的知识点:mysql的存储过程.mysql的event事件调度. 参考资料: Qiao_Zhi的博客:[周期性执行事件]MySQL事件(Event)& ...

  10. Vim搜索关键字

    有以下两种方法 Method 1:/content 默认从上往下查找 只读模式下输入 /content 后回车 按 n 向下查找 按N 向上查找 Method 2:?content 默认从下往上查找 ...