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

Duc*_*ani 8 c++ python cmake pybind11

我希望能够将我的 C++ 代码作为 python 包调用。为此,我使用pybind11CMakelists (遵循此示例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)
Run Code Online (Sandbox Code Playgroud)

但当使用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)
Run Code Online (Sandbox Code Playgroud)

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

任何想法 ?

Tsy*_*rev 9

函数pybind11_add_module创建一个库目标,可用于将添加的模块与其他库链接:

\n\n
pybind11_add_module(namr ${SOURCES} "${SOURCE_DIR}/bindings.cpp")\ntarget_link_libraries(namr PUBLIC GSL::gsl GSL::gslcblas)\n
Run Code Online (Sandbox Code Playgroud)\n\n

文档中明确说明了这一点:

\n\n
\n

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

\n
\n

  • 非常感谢你,我是 Cmake 新手,无法像我应该的那样浏览文档。然而,这现在产生了一个超出我理解的新错误:`CMake Error at CMakeLists.txt:22 (target_link_libraries): The keywords signature for target_link_libraries has has not beenused with the target "namr"。target_link_libraries 与目标的所有使用都必须是 all-keyword 或 all-plain` (3认同)
  • @ankit7540:您可以通过设置“CMAKE_PREFIX_PATH”变量来提示“find_package”有关 GSL 的位置。看看我的答案:/sf/answers/2435800951/ (2认同)