小编Dor*_*roy的帖子

.so 似乎由于 pybind11 参数而未导出 C++ 函数

我目前正在尝试定义一个共享库,我的目标是从 Python C++ 扩展以及普通 C++ 应用程序中使用它。

我设法构建了共享库,并尝试将一个简单的 C++ 应用程序链接到它以测试其功能,但共享库的函数之一被链接器视为未定义的引用。检查后nm --demangle --dynamic --defined-only --extern-only libmylib.so,我意识到该函数没有被共享库导出,但我不知道为什么。

该函数的签名如下:

void bootstrap_mylib(std::vector<std::string> python_path,
        std::vector<std::string> python_scripts,
        std::string interface_module,
        std::function<void (pybind11::module_, pybind11::object)> interface_module_initializer);
Run Code Online (Sandbox Code Playgroud)

如果我注释掉最后一个参数,一切都会顺利,所以问题似乎来自于我以某种方式声明与 pybind11 的依赖关系的方式。

以下是我的 CMakeLists.txt 的相关部分:

set(CMAKE_CXX_COMPILER /usr/bin/g++)

project(monilog LANGUAGES CXX VERSION 0.0.1)

set(PYBIND11_PYTHON_VERSION 3.8)
find_package(pybind11 REQUIRED)
include_directories(${PYTHON_INCLUDE_DIRS})

add_library(mylib SHARED MyLib.cc MyLib.h)
set_property(TARGET mylib PROPERTY CXX_STANDARD 17)

target_link_libraries(mylib ${PYTHON_LIBRARIES})

set_target_properties(mylib PROPERTIES VERSION ${PROJECT_VERSION})
set_target_properties(mylib PROPERTIES SOVERSION 1)
set_target_properties(mylib PROPERTIES PUBLIC_HEADER MyLib.h)
Run Code Online (Sandbox Code Playgroud)

知道我可能做错了什么吗?

编辑:最小工作示例

这是我的问题的一个最小示例,包含以下文件:

example.h

#include <pybind11/stl.h>

namespace Example
{
    void simple_func(std::string …
Run Code Online (Sandbox Code Playgroud)

c++ cmake shared-libraries pybind11

5
推荐指数
1
解决办法
137
查看次数

标签 统计

c++ ×1

cmake ×1

pybind11 ×1

shared-libraries ×1