Makefile
时,它工作得很好。当我尝试使用cmake
时,它的效果并不理想。在C++代码:
#include <boost/python.hpp>
#include <iostream>
extern "C"
char const* greet()
{
return "hello, world";
}
BOOST_PYTHON_MODULE(hello_ext)
{
using namespace boost::python;
def("greet", greet);
}
int main(){
std::cout<<greet()<<std::endl;
return 0;
}
生成文件:
^{pr2}$当我编译这个文件时,我得到一个.so
文件,它可以包含在脚本中
import sys
sys.path.append('/home/myname/Code/Trunk/TestBoostPython/build/')
import libhello_ext_lib as hello_ext
print(hello_ext.greet())
我真的想用cmake
代替手工编写的Makefile
,所以我写了以下内容:
cmake_minimum_required(VERSION 3.6)
PROJECT(hello_ext)
# Find Boost
find_package(Boost REQUIRED COMPONENTS python-py27)
set(PYTHON_DOT_VERSION 2.7)
set(PYTHON_INCLUDE /usr/include/python2.7)
set(PYTHON_LIBRARY /usr/lib/python2.7/config-x86_64-linux-gnu)
include_directories(${PYTHON_INCLUDE} ${Boost_INCLUDE_DIRS})
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -lrt -O3")
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
SET(LIBNAME hello_ext_lib)
add_library(${LIBNAME} SHARED src/hello_ext.cpp)
add_executable(${PROJECT_NAME} src/hello_ext.cpp)
TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${Boost_LIBRARIES} -lpython2.7 -fPIC)
TARGET_LINK_LIBRARIES(${LIBNAME} ${Boost_LIBRARIES} -lpython2.7 -fPIC -shared)
在这里,我目前手工输入Python-paths
,但我也尝试过使用fin_package(PythonLibs)
,但没有成功。在
当我在../bin/
中运行可执行文件时,该程序编译良好并执行。但是,当我运行python脚本时,我总是得到:
ImportError: dynamic module does not define init function (initlibhello_ext_lib)
我找到了this,它说如果lib
和{.so
?在
我还试图不编译可执行文件,而只编译库。这也没用。在
BOOST_PYTHON_MODULE(hello_ext)
创建一个init函数“inithello_ext”,它应该对应于一个模块“hello\u ext”。但您试图导入“libhello_ext_lib”。在为模块指定与文件名相同的名称。E、 g.
BOOST_PYTHON_MODULE(libhello_ext_lib)
。在相关问题 更多 >
编程相关推荐