Linux 下Python调用C++编写的动态库
在工程中用到使用Python调用C++编写的动态库,结果报如下错误:
OSError: ./extract_str.so: undefined symbol: _ZNSt8ios_base4InitD1Ev
Python调用函数
#coding:utf-8
from ctypes import * libpcre = cdll.LoadLibrary("./extract_str.so")
pcre="^GirlFriend\s+Server\s+\d+\x2E\d+\s+\x2E\s+port\s+\d"
ret = libpcre.extract_exact_strings(pcre, len(pcre), 4, max_str, max_str_len, expr_str, expr_str_len)
if ret == 1: #解析成功
print(ret)
print(max_str)
print(expr_str)
else: #解析失败
print("ret is not 1!")
加载目录文件
报错:

执行nm命令
通过搜索知道ios_base4Init 是C++标准输入输出函数库,说明该库未被加载。搜索知道是由于链接的问题。
Stackoverflow链接:http://stackoverflow.com/questions/10906275/undefined-reference-to-stdios-baseinitinit
查看Makefile
CC = gcc
CCC = g++
CFLAGS = -g -Wall $(OPEN_O2) -Wstrict-prototypes -fPIC
CPPFLAGS = -g -Wall $(OPEN_O2) -fPIC
INCS = -I../include
SOURCES = $(wildcard *.c *.cpp)
OBJS = $(patsubst %.cpp,%.o, $(patsubst %.c, %.o, $(SOURCES)))
TARGETS = extract_str.a
SHARD_TARGETS = extract_str.so .PHONY: all clean .c.o:
$(CC) -c $(CFLAGS) -I. $(INCS) $<
.cpp.o:
$(CCC) -c $(CPPFLAGS) -I. $(INCS) $< all: $(TARGETS) $(SHARD_TARGETS) clean:
rm -f *.a *.o core core.* *~
rm ../lib/$(TARGETS)
rm ../lib/$(SHARD_TARGETS) $(TARGETS): $(OBJS)
ar -cr ../lib/$@ $^ $(SHARD_TARGETS): $(OBJS)
$(CC) -shared -o ../lib/extract_str.so $^
源文件为C++,在生成动态库时使用的是gcc,导致C++标准库未被链接。两种修改方式
1. 用g++编译,命令改为:
$(CCC) -shared -o ../lib/extract_str.so $^
2. 继续使用gcc编译,添加链接参数 –lstdc++ 命令改为:
$(CC) -shared -o ../lib/extract_str.so $^ -lstdc++
Linux 下Python调用C++编写的动态库的更多相关文章
- Delphi调用C# 编写dll动态库
Delphi调用C# 编写dll动态库 编写C#dll的方法都一样,首先在vs2005中创建一个“类库”项目WZPayDll, using System.Runtime.InteropServices ...
- linux下python调用c模块
在C调用Python模块时需要初始化Python解释器,导入模块等,但Python调用C模块却比较简单,下面还是以helloWorld.c 和 main.py 做一说明: (1)编写C代码,hel ...
- linux下python调用.so文件
前言 使用python 调用Fanuc的动态链路库.so 文件读取数据 环境要求 环境 需求 ubuntu16.04 32位 python3.5 32位 配置 把so文件添加到默认路径 ln -s / ...
- python调用c++开发的动态库
此处列举一下python调用Windows端动态库. # *- coding=utf-8 -* import ctypes from ctypes import * import os objdll ...
- linux下java调用.so动态库方法2: JNA
摘自:http://blog.csdn.net/todorovchen/article/details/21319033 另请参见: http://blog.sina.com.cn/s/blog_8c ...
- linux下java调用C
linux下java调用C 分类: linux2012-05-22 09:12 1529人阅读 评论(0) 收藏 举报 javalinuxmakefilegccclasscommand 下面是在ubu ...
- linux下java调用.so文件的方法1: JNI
摘自http://blog.163.com/squall_smile/blog/static/6034984020129296931793/ https://my.oschina.net/simabe ...
- Linux下的 sniff-andthen-spoof程序编写
Linux下的 sniff-andthen-spoof程序编写 一.任务描述 在本任务中,您将结合嗅探和欺骗技术来实现以下嗅探然后欺骗程序.你需要两台机器在同一个局域网.从机器A ping IP_X, ...
- Linux下Python 文件内容替换脚本
Linux下Python 文件替换脚本 import sys,os if len(sys.argv)<=4: old_text,new_text = sys.argv[1],sys.argv[2 ...
随机推荐
- Codeforces_766_D_(并查集)
D. Mahmoud and a Dictionary time limit per test 4 seconds memory limit per test 256 megabytes input ...
- HDU_2955_Robberies_01背包
A - Robberies Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submi ...
- vi 命令学习(二)
[选中文本(可视模式)] v 可视模式 从光标位置开始按正常模式选择文本 V 可视行模式 选中光标经过的完整行 ctrl + v 可视块模式 垂直方向选中文本 [ 撤销和恢复撤销] u undo 撤销 ...
- Java必知必会的20种常用类库和API
转载:https://blog.csdn.net/u011001084/article/details/79216958 个人感觉工具类对日常开发是很重要的,所以推荐一下这篇文章,虽然有的类库过时了 ...
- ES 提案的各状态
JavaScrpit,亦即 ECMAScript,新功能的演进是由一个叫 TC39 这么个组织在统筹协调和推进的. 一般新特性会由社区先提案,被采纳后开始进入下一流程.一个提案到最终落地到成为标准,需 ...
- rename命令中正则表达式的使用
rename命令用字符串替换的方式批量改变文件名. 格式如下: rename 原字符串 目标字符串 文件(列表) 原字符串:将文件名需要替换的字符串: 目标字符串:将文件名中含有的原字符替换成目标 ...
- 洛谷——P1475 控制公司 Controlling Companies
P1475 控制公司 Controlling Companies 题目描述 有些公司是其他公司的部分拥有者,因为他们获得了其他公司发行的股票的一部分.(此处略去一句废话)据说,如果至少满足了以下三个条 ...
- java环境初级部署及项目搭建
一.网页地址 Java各版本下载地址: http://www.oracle.com/technetwork/cn/java/archive-139210-zhs.html Eclipse官方下载地址: ...
- Spring Boot之简单的MVC
最近开始看Spring Boot,发现其开发起来真是方便.今天就来实现一个简单的Spring MVC 请求,纯Java代码的哦. 1.Maven必不可少,先看看都加载了那些依赖: <?xml v ...
- TestNG套件测试(二)
在xml中指定要运行的整个包来执行套件测试 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ...