胸拳和厘米

2024-09-24 02:19:36 发布

您现在位置:Python中文网/ 问答频道 /正文

<>我已经成功地遵循了如何连接C++和Python的{a1}示例。当我使用给定的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?在

我还试图不编译可执行文件,而只编译库。这也没用。在


Tags: 文件projectcmakelibrarieshelloincludelibext
1条回答
网友
1楼 · 发布于 2024-09-24 02:19:36

BOOST_PYTHON_MODULE(hello_ext)创建一个init函数“inithello_ext”,它应该对应于一个模块“hello\u ext”。但您试图导入“libhello_ext_lib”。在

为模块指定与文件名相同的名称。E、 g.BOOST_PYTHON_MODULE(libhello_ext_lib)。在

相关问题 更多 >