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

时间:2018-04-23 09:57:58

标签: python c++ cmake pybind11

我希望能够将我的C ++代码称为python包。为此,我将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 个答案:

答案 0 :(得分:2)

函数pybind11_add_module(namr ${SOURCES} "${SOURCE_DIR}/bindings.cpp") target_link_libraries(namr PUBLIC GSL::gsl GSL::gslcblas) 创建了一个库目标,可用于链接添加模块与其他库:

add_library

这在documentation中明确说明:

  

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

相关问题