gpt4 book ai didi

python - BoostPython 和 CMake

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:06:50 25 4
gpt4 key购买 nike

我已成功关注this如何连接 C++ 和 python 的示例。当我使用给定的 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;
}

生成文件:

# location of the Python header files
PYTHON_VERSION = 27
PYTHON_DOT_VERSION = 2.7
PYTHON_INCLUDE = /usr/include/python$(PYTHON_DOT_VERSION)
# location of the Boost Python include files and library
BOOST_INC = /usr/include
BOOST_LIB = /usr/lib/x86_64-linux-gnu/
# compile mesh classes
TARGET = hello_ext
$(TARGET).so: $(TARGET).o
g++ -shared -Wl,--export-dynamic $(TARGET).o -L$(BOOST_LIB) -lboost_python-py$(PYTHON_VERSION) -L/usr/lib/python$(PYTHON_DOT_VERSION)/config-x86_64-linux-gnu -lpython$(PYTHON_DOT_VERSION) -o $(TARGET).so
$(TARGET).o: $(TARGET).cpp
g++ -I$(PYTHON_INCLUDE) -I$(BOOST_INC) -fPIC -c $(TARGET).cpp

当我编译它时,我得到一个可以包含在脚本中的 .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 路径,但我也尝试过使用 fin_package(PythonLibs) 但没有成功。

当我运行 ../bin/ 中的可执行文件时,程序可以正常编译并执行。但是,当我运行 python 脚本时,我总是得到:

ImportError: dynamic module does not define init function (initlibhello_ext_lib)

我找到了 this这表示如果 libexecutable 具有不同的名称,就会发生这种情况。确实是这样,但是我怎样才能得到名称正确的.so呢?

我还尝试不编译可执行文件而只编译库。那也没有用。

最佳答案

BOOST_PYTHON_MODULE(hello_ext) 创建一个初始化函数“inithello_ext”,它应该对应于一个模块“hello_ext”。但是您正在尝试导入“libhello_ext_lib”。

为模块指定与文件名相同的名称。例如。 BOOST_PYTHON_MODULE(libhello_ext_lib)

关于python - BoostPython 和 CMake,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52929146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com