C++ 如何在库中包含外部库?

C++ 如何在库中包含外部库?,c++,C++,我正在写一个库,它本身使用一个只有头的第三方库 目前,即使我将其构建为一个静态库,客户机代码仍然需要添加该第三方库,正如在我的库的头文件中声明的那样 我该怎么做才能使我的代码所使用的所有内容都在静态库中结束,而客户机代码不必包含我在头文件中包含的内容 有一个问题,但答案似乎不适用于我,因为我正在构建包含所有依赖项的静态库(即,配置了包含路径并成功构建) 为了让您更好地了解我的Core.h如下所示: \ifndef CORE\u H #定义核心 #包括 #包括 #包括 #包括 #包括 #包括 #包

我正在写一个库,它本身使用一个只有头的第三方库

目前,即使我将其构建为一个静态库,客户机代码仍然需要添加该第三方库,正如在我的库的头文件中声明的那样

我该怎么做才能使我的代码所使用的所有内容都在静态库中结束,而客户机代码不必包含我在头文件中包含的内容

有一个问题,但答案似乎不适用于我,因为我正在构建包含所有依赖项的静态库(即,配置了包含路径并成功构建)

为了让您更好地了解我的
Core.h
如下所示:

\ifndef CORE\u H
#定义核心
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
名称空间py=pybind11;
使用名称空间py::literals;
typedef void(*CallbackFn)(bool,std::string,py::array_t&);
typedef std::函数LogFunction;
类核心
{
私人:
py::作用域_解释器保护{};
py::对象cls;
py::objectobj;
py::objectstartfunc;
py::对象stopFunc;
py::对象setCpuAffinityFunc;
py::objectaddcallbackfunc;
py::objectremovecallbackfunc;
py::对象getCallbackFunc;
py::dict-kwargs;
py::list callbackList;
公众:
核心();
核心(boolshowfeed);
...
正如您所看到的,这里的问题是在我的代码中使用的
Pybind11
仅头库。不幸的是,由于这些
#include
语句包含在我的头文件中,客户端代码还需要将
Pybind11
添加到他们的项目中,以便构建他们的项目


除了将所有的<代码> p:::*/> >转换为<代码> Value>代码之外,还有其他方法,然后在“代码>核心.CPP < /代码>文件>

< p>中找到了一个解决方案。请考虑您的情况:客户端使用一个使用第三库的库。 这可由以下溶液吸收:

  • Client:.exe项目
    是只知道
    核心项目
  • Core:.lib项目
    使用第三方(
    Header\u lib project
    ),可由
    客户项目
  • 头库项目是第三方库
解决方案配置:
-
客户项目
依赖于
核心项目

DUMPBIN /SYMBOLS   "G:\Core.lib" | findstr "useThirdParty"  

-
核心项目
依赖于
标题库项目

DUMPBIN /SYMBOLS   "G:\Core.lib" | findstr "useThirdParty"  

在代码中:

  • Client
    创建CCore对象的实例
    cc
  • cc
    调用
    useCoreParty
    函数
  • useCoreParty
    函数使用第三方
  • 当我导出
    core.lib
    时:

    DUMPBIN /SYMBOLS   "G:\Core.lib" | findstr "useThirdParty"  
    
    我得到:


    这意味着第三方部分包含在您的代码>核心.lib中。因此,客户端不需要包含第三方的lib

    < p>我为您找到了一个解决方案。请考虑您的情况:客户端使用一个使用第三库的库。 这可由以下溶液吸收:

    • Client:.exe项目
      是只知道
      核心项目
    • Core:.lib项目
      使用第三方(
      Header\u lib project
      ),可由
      客户项目
    • 头库项目是第三方库
    解决方案配置:
    -
    客户项目
    依赖于
    核心项目

    DUMPBIN /SYMBOLS   "G:\Core.lib" | findstr "useThirdParty"  
    

    -
    核心项目
    依赖于
    标题库项目

    DUMPBIN /SYMBOLS   "G:\Core.lib" | findstr "useThirdParty"  
    

    在代码中:

  • Client
    创建CCore对象的实例
    cc
  • cc
    调用
    useCoreParty
    函数
  • useCoreParty
    函数使用第三方
  • 当我导出
    core.lib
    时:

    DUMPBIN /SYMBOLS   "G:\Core.lib" | findstr "useThirdParty"  
    
    我得到:


    这意味着thirdparty部分包含在您的
    core.lib
    中。因此,客户端不需要包含thirdparty的libs

    我最终使用了前向声明,而不是
    Pybind11
    类。 这就是我最后做的:

    
    //头文件
    #ifndef堆芯
    #定义核心
    #包括
    #包括
    #包括
    #包括
    结构Wapper;
    类核心
    {
    私人:
    瓦珀*cls;
    Wapper*obj;
    Wapper*startFunc;
    Wapper*stopFunc;
    ...
    公众:
    核心();
    ...
    };
    
    在实施文件中:

    #包括
    ...
    名称空间py=pybind11;
    使用名称空间py::literals;
    结构包装器
    {
    py::objectobj;
    };
    py::作用域_解释器保护{};
    Core::Core()
    {
    此->cls=new PyWrapper();
    this->obj=new PyWrapper();
    ...
    自动服务UtilsModule=py::module::导入(“模块”);
    this->cls->obj=serviceUtilsModule.attr(“SomeClass”);
    ...
    此->对象->对象=此->cls->对象(**kwargs);
    ...
    }
    
    这对客户端代码隐藏了pybind11依赖项,并实现了我想要的

    基本上,我向前声明了一个新类型,用它做了一个指针,并在core.cpp中定义了它。由于我在
    core.cpp
    中定义了它,我有很多选择,其中之一就是在它里面添加一个py::object并使用它

    旁注:
    我注意到客户端项目必须包含
    Python
    include
    library
    文件夹,否则,它会抱怨没有找到
    Pybind11
    !这真的很奇怪!但是由于客户端代码将在必须安装Python包的环境中运行,这不是问题!
    然而,我也想知道为什么会发生这种情况!

    我最终使用了前向声明,但不是针对
    Pybind11
    类。 这就是我想要的