【发布时间】:2020-04-04 04:56:45
【问题描述】:
我正在编写一个库,它本身使用一个只有标头的 3rd-party 库。
目前,即使我将其构建为静态库,客户端代码仍需要添加该第 3 方库,因为它在我的库的头文件中声明。
我该怎么做才能使我的代码使用的所有内容最终都保存在静态库中,并且客户端代码不必包含我在头文件中包含的内容?
有一个similar question,但答案似乎对我不起作用,因为我正在构建具有所有依赖项的静态库(即配置包含路径并且构建成功)。
为了给你更好的视角,我的Core.h 是这样的:
#ifndef CORE_H
#define CORE_H
#include <iostream>
#include <string>
#include <vector>
#include <functional>
#include <pybind11/pybind11.h>
#include <pybind11/embed.h>
#include <pybind11/stl.h>
#include <pybind11/functional.h>
#include <pybind11/numpy.h>
namespace py = pybind11;
using namespace py::literals;
typedef void(*CallbackFn)(bool, std::string, py::array_t<uint8_t>&);
typedef std::function<void(std::string)> LogFunction;
class Core
{
private:
py::scoped_interpreter guard{};
py::object cls;
py::object obj;
py::object startFunc;
py::object stopFunc;
py::object setCpuAffinityFunc;
py::object addCallbackFunc;
py::object removeCallbackFunc;
py::object getCallbacksFunc;
py::dict kwargs;
py::list callbackList;
public:
Core();
Core(bool showFeed);
...
如您所见,这里的问题是我的代码中使用的 Pybind11 仅标头库。不幸的是,由于这些#include 语句包含在我的头文件中,因此客户端代码还需要将pybind11 添加到他们的项目中才能构建他们的项目。
除了将所有py::* 转换为void* 然后将头文件包含在Core.cpp 文件中之外,还有其他方法吗?
【问题讨论】:
-
如果它们是指针,可以将
py::*替换为void*,但是您如何/如何使用类Core? -
@shingo :我将不得不将它们重铸回 py:: 它们在实现方面的内容并继续。但这根本不理想,因为 pybind 在这个部门很头疼,因为我对它不是很熟悉。所以这是我考虑的最后手段
-
@Rika 问题:您必须只使用 .lib 吗?没有DLL?因为我认为 DLL 可以解决您的问题
-
@Landstalker 我也可以使用 DLL,实际上我应该同时实现这两种情况。但现在我遇到了静态库的问题。但是,我想我也会在 DLL 中遇到问题。如果您能详细解释如何在 dll 中避免这种情况,将不胜感激!
标签: c++