【发布时间】: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++,考虑到这一点,这篇文章会很有帮助。
-
当然。没想到是这样的。