使用ctypes包装C++:未定义的符号

Aer*_*ius 1 c++ python ctypes shared-libraries word-wrap

我正在尝试包装C++以便在Python中使用C++函数.目前我正在尝试ctypes,不幸的是,我还没有成功.对于初学者,我用C++编写了一个Hello World程序,我试图用ctypes从Python中调用它.这就是我所做的:

path_to_dir $ vim helloworld.cpp

1: #include <iostream>
2:
3: using namespace std;
4:
5: int main()
6: {
7:     cout << "Hello, world!" << endl;
8:     return 0;
9: }

path_to_dir $ gcc -shared -Wl,-soname,hello_module -o hello_module.so -fPIC helloworld.cpp
path_to_dir $ vim helloworld.py

1: import ctypes
2:
3: libc = ctypes.cdll.LoadLibrary("path_to_dir/hello_module.so")
4: 
5: libc.main()

path_to_dir $ python helloworld.py

Traceback (most recent call last):
  File "helloworld.py", line 3, in <module>
    libc = ctypes.cdll.LoadLibrary("/home/carlos/Workspace/Freestyle/Wrapping_C++/ctypes/hello_module.so")
  File "/usr/lib/python2.7/ctypes/__init__.py", line 443, in LoadLibrary
return self._dlltype(name)
  File "/usr/lib/python2.7/ctypes/__init__.py", line 365, in __init__
self._handle = _dlopen(self._name, mode)
OSError: /home/carlos/Workspace/Freestyle/Wrapping_C++/ctypes/hello_module.so: undefined symbol: _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_
Run Code Online (Sandbox Code Playgroud)

回溯提到了一些未定义的符号,但我不知道为什么我会得到这个错误以及如何解决它.我也尝试过标准的C++库,而不是自己编写这样的库.结果很好.有人可以帮忙吗?

小智 5

你应该编译g++而不是gcc. gcc不会将二进制文件与c ++库链接.