我希望能够将我的C++代码作为python包调用。要做到这一点,我使用pybind11
和CMakelists (按照下面的示例示例)。我的问题是,我必须在代码的编译中包含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)
但这会在建筑中产生错误。
知道吗?
发布于 2018-04-23 02:06:24
函数pybind11_add_module
创建了一个库目标,它可以与其他库一起用于添加链接模块:
pybind11_add_module(namr ${SOURCES} "${SOURCE_DIR}/bindings.cpp")
target_link_libraries(namr PUBLIC GSL::gsl GSL::gslcblas)
这一点在文档中有明确的表述
这个函数的行为非常类似于CMake的内置
add_library
(实际上,它是一个围绕该命令的包装函数)。它将添加一个名为<name>
的库目标,它将从列出的源文件中构建。此外,它还将处理所有特定于Python的编译器和链接器标志,以及操作系统和Python版本特定的文件扩展名。生成的目标<name>
可以使用常规的CMake命令进一步操作。
https://stackoverflow.com/questions/49978208
复制相似问题