代码之家  ›  专栏  ›  技术社区  ›  Duccio Piovani

Python和C++:如何将pybind11与Cmakelists(包括GSL库)一起使用

  •  4
  • Duccio Piovani  · 技术社区  · 6 年前

    我希望能够以python包的形式调用我的C++代码。为此,我正在使用 pybind11 使用CMakelists(以下示例 https://github.com/pybind/cmake_example )。我的问题是,我必须在代码编译中包含GSL库,而这些库需要一个显式链接器 -lgsl

    如果我只是编译和运行C++而不使用python包装它,那么下面的Cmakelists。txt文件执行此任务

    cmake_minimum_required(VERSION 3.0)
    
    set(CMAKE_BUILD_TYPE Debug)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
    
    project(myProject)
    
    
    add_executable(
        myexecutable
        main.cpp
        function1.cpp
    )
    
    find_package(GSL REQUIRED)
    target_link_libraries(myexecutable GSL::gsl GSL::gslcblas)
    

    但使用时 pybind11 我找到的模板不允许 add_executable 因此 target_link_libraries 不起作用。

    我已经试过了

    project(myProject)
    
    set(CMAKE_CXX_STANDARD 11)
    set(CMAKE_CXX_STANDARD_REQUIRED YES)   # See below (1)
    
    
    
    # Set source directory
    set(SOURCE_DIR "project")
    
    # Tell CMake that headers are also in SOURCE_DIR
    include_directories(${SOURCE_DIR})
    set(SOURCES "${SOURCE_DIR}/functions.cpp")
    
    
    # Generate Python module
    add_subdirectory(lib/pybind11)
    pybind11_add_module(namr ${SOURCES} "${SOURCE_DIR}/bindings.cpp")
    
    
    FIND_PACKAGE(GSL REQUIRED)
    target_link_libraries(GSL::gsl GSL::gslcblas)
    

    但这会在建筑中产生错误。

    有什么想法吗?

    1 回复  |  直到 6 年前
        1
  •  5
  •   Tsyvarev    6 年前

    作用 pybind11_add_module 创建库 目标 ,可用于将添加的模块链接到其他库:

    pybind11_add_module(namr ${SOURCES} "${SOURCE_DIR}/bindings.cpp")
    target_link_libraries(namr PUBLIC GSL::gsl GSL::gslcblas)
    

    这在 documentation :

    此函数的行为非常类似于CMakes内置 add_library (实际上,它是围绕该命令的包装函数)。它将添加一个名为 <name> 将从列出的源文件中生成。此外,它将处理所有特定于Python的编译器和链接器标志以及特定于OS和Python版本的文件扩展名。产生的目标 <名称(>); 可以使用常规CMake命令进行进一步操作。