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 ...
随机推荐
- 个人觉得比较好用的chrome插件
印象笔记·悦读 "悦读"可使博文.文章和网页变得简明而又易于阅读.将其保存至印象笔记以便随时随地阅读. Anything to QRcode 通过右键菜单或地址栏按钮将当前页面地址 ...
- BZOJ1996: [Hnoi2010]chorus 合唱队 (DP)
就是想水一发 #include <stdio.h> #include <algorithm> #include <iostream> using namespace ...
- luogu P3899 [湖南集训]谈笑风生 线段树合并
Code: #include<bits/stdc++.h> #define maxn 300002 #define ll long long using namespace std; vo ...
- 如何使用crash分析vmcore - 之基础思路case1
如何使用crash分析vmcore - 之基础思路case1 dmesg查看内核日志 [2493382.671020] systemd-shutdown[1]: Sending SIGKILL to ...
- layer弹出层无法关闭问题
parent.layer.closeAll();如果关闭指定弹出层,获取对应弹出层的索引,进行关闭
- Group共享网元
熟悉TWaver的用户都知道Group的概念,如果是Group,那必然会出现一个网元在多组的情况,最近有客户遇到这个问题,给写了Demo,这些也跟大家分享一下如何实现,先让我们看看共享网元的效果. 熟 ...
- Address already in use: JVM_Bind:8080错误的解决办法
解决办法:先到命令行查找8080端口号被那个占用,输入后面的命令:netstat -ano 查到 然后到任务管理器把PID为20904的进程给结束掉,就OK了 -------------------- ...
- 53.doc value机制内核级原理深入探秘
主要知识点: doc value的原理 doc value性能优化 一.doc value原理 1. 生成时间:index-time生成 PUT/POST的时候,就会生成doc ...
- (二)Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用
#!usr/bin/env python # -*- coding: utf-8 -*- def test(): print('hello, world') if __name__ == " ...
- 马拉车,O(n)求回文串
马拉车,O(n)求回文串 对整个马拉车算法步骤做个总结: 第一步:将每个原字母用两个特殊字符包围如: aaa --> #a#a#a# abab -->#a#b#a#b 同时可以由这个翻倍的 ...