【问题标题】:organizing external libraries and include files组织外部库和包含文件
【发布时间】:2010-06-17 08:24:40
【问题描述】:

多年来,我的项目使用越来越多的外部库,而我这样做的方式开始感到越来越尴尬(尽管不得不说,它确实完美无缺)。我在 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>

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

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

【问题讨论】:

  • DSP 的.??那是数字信号处理单元吗?如果我们尽量减少使用神秘的无法解释的缩写,这可能对所有人都是最好的。可以使用缩写,只要它们在首次使用时 (WFU) 进行了解释
  • @zipzit 是的,这是一个数字信号处理器。在撰写本文时,我可能认为这很明显,因为提到了 Code Composer。
  • 可以让您更新原始问题以删除 Unexplained Abbreviations (UA) 吗?当您将机器学习/OpenCV/实时操作系统和处理/树莓派相加时。我可以看到很多人重新使用 C/C++,考虑到这一点,这篇文章会很有帮助。
  • 当然。没想到是这样的。

标签: c++ api external


【解决方案1】:

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

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

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

【讨论】:

  • 这确实是个好主意,可以用来代替复制。 Windows 上的命令是 'mklink /J'
猜你喜欢
  • 2014-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 2016-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多