gpt4 book ai didi

c++ - 组织外部库和包含文件

转载 作者:太空狗 更新时间:2023-10-29 23:09:57 25 4
gpt4 key购买 nike

这些年来,我的项目使用了越来越多的外部库,我的做法开始变得越来越笨拙(尽管不得不说,它确实可以完美运行)。我在 Windows 上使用 VS,在其他平台上使用 CMake,在 Windows 上使用 CodeComposer 来定位数字信号处理器 (DSP)。除 DSP 外,32 位和 64 位平台均有使用。

这是我现在正在做的一个例子;请注意,如图所示,不同的外部库本身并不总是以相同的方式组织。有些有不同的 lib/include/src 文件夹,有些只有一个 src 文件夹。有些已经准备好与静态和/或共享库一起使用,其他的已经构建

/path/to/projects
/projectA
/projectB

/path/to/apis
/apiA
/src
/include
/lib

/apiB
/include
/i386/lib
/amd64/lib

/path/to/otherapis
/apiC
/src

/path/to/sharedlibs
/apiA_x86.lib -->some libs were built in all possible configurations
/apiA_x86d.lib
/apiA_x64.lib
/apiA_x64d.lib
/apiA_static_x86.lib
/apiB.lib -->other libs have just one import library

/path/to/dlls -->most of this directory also gets distributed to clients
/apiA_x86.dll and it's in the PATH
/apiB.dll

我每次添加外部库,大致都是这样的流程:

  • 如果需要,针对不同的配置(发布/调试/平台)构建它
  • 将它的静态和/或导入库复制到“sharedlibs”
  • 将其共享库复制到“dll”
  • 添加一个环境变量,例如指向 ApiA 根目录的“API_A_DIR”,如“/path/to/apis/apiA”
  • 创建一个 VS 属性表和一个 CMake 文件来声明包含路径和最终的库名称,例如 include = '$(API_A_DIR)/Include' 和 lib = apiA.lib
  • 将propertysheet/cmake文件添加到需要库的项目中

尤其让我困扰的是第 4 步和第 5 步。我很确定我不是唯一面临这个问题的人,并且想看看其他人是如何处理这个问题的。

我想摆脱每个库的环境变量,只使用一个“API_INCLUDE_DIR”并以有组织的方式用包含文件填充它:

/path/to/api/include
/apiA
/apiB
/apiC

这样我就不需要属性表中的包含路径,也不需要环境变量。对于仅在 Windows 上使用的库,我什至根本不需要属性表,因为我可以使用 #pragmas 指示链接器链接到哪个库。同样在代码中,包含的内容将更加清晰,并且包装器无需包含具有相同名称但来自不同库的文件:

#include <apiA/header.h>
#include <apiB/header.h>
#include <apiC_version1/header.h>

撤回当然是我必须复制包含文件,并且可能**在文件系统上引入重复项,但这看起来是一个很小的代价,不是吗?

** 实际上,一旦构建了库,我唯一需要的就是包含文件和库。由于它们中的每一个都有一个专用目录,因此不再需要原始源代码树,因此可以将其删除。

最佳答案

为什么不使用文件系统链接?

ln -s/path/to/apis/apiA/include/path/to/api/include/apiA

瞧。类似的操作可以在 Windows 上完成,但我现在没有方便的命令行。

关于c++ - 组织外部库和包含文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3060015/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com