使用SWIG包装python的C代码.无法使用cout命令

我正在尝试使用SWIG为python包装这个简单的C代码

#include "hello.h"

int helloW() 
{
    std::cout << "Hello,World!" ;
    return 0;
}

这里是相对标题

#include 

正如我正在使用的SWIG输入文件

/* file : pyhello.i */

/* name of module to use*/
%module pyhello
%{
    #include "hello.h"
%}    
%include "hello.h";

现在,我的makefile(运行正常)是:

all:
    swig -c++ -python -Wall pyhello.i 
    gcc -c -fpic pyhello_wrap.cxx hello.cpp -I/usr/include/python2.7
    gcc -shared hello.o pyhello_wrap.o -o _pyhello.so

因为我能够从不同的来源汇总相关的问题在线.
现在,一旦我尝试使用命令导入python我的库

>>> import pyhello

这是我得到的错误

    Traceback (most recent call last):
  File "__init__.py",line 37,in import_module
    __import__(name)
ImportError: ./_pyhello.so: undefined symbol: _ZSt4cout

这让我觉得这个问题与命令std :: cout相关,或者一般来说,与标准库< iostream>相关.

希望有人可以给我一些关于这个问题的提示.非常感谢提前!!

注意:同样的问题我尝试使用命令printf()而不是std :: cout和库< cstdio>而不是< iostream>

最佳答案

ImportError: ./_pyhello.so: undefined symbol: _ZSt4cout

用c filt _ZSt4cout你会发现它是std :: cout(name mangling).

你应该使用g,而不是gcc,尤其是你的链接器命令(带-shared).

或者您需要显式链接某些-lstdc您的共享库.

阅读Drepper的How to Write Shared Libraries(因为Python是dlopen(3),然后是dlsym(3)).

你最好声明为extern“C”int helloW(void);你的日常工作(阅读C++ dlopen minihowto).

相关文章

功能概要:(目前已实现功能)公共展示部分:1.网站首页展示...
大体上把Python中的数据类型分为如下几类: Number(数字) ...
开发之前第一步,就是构造整个的项目结构。这就好比作一幅画...
源码编译方式安装Apache首先下载Apache源码压缩包,地址为ht...
前面说完了此项目的创建及数据模型设计的过程。如果未看过,...
python中常用的写爬虫的库有urllib2、requests,对于大多数比...