代码之家  ›  专栏  ›  技术社区  ›  El_Loco

助推器和刹车

  •  4
  • El_Loco  · 技术社区  · 8 年前

    我已经成功地跟踪了 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;
    }
    

    Makefile:

    # 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_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 以及 executable 有不同的名字。确实如此,但我如何才能获得 所以 用正确的名字?

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

    1 回复  |  直到 8 年前
        1
  •  2
  •   Ghpst    8 年前

    BOOST_PYTHON_MODULE(hello_ext) 创建一个init函数“init hello-ext”,它应该对应于一个模块“hello-ext”。但您正在尝试导入“libhello-ext-lib”。

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

    推荐文章