哪里可以放置第三方图书馆?

时间:2016-12-21 07:39:12

标签: c++ libraries organization

这可能看起来有点荒谬,但我很难找到一个好的系统。是否有用于存储和组织第三方开发库的标准化系统?我受到强迫症的困扰并认为自己是一个“整洁的怪物”,所以我倾向于使用大量的目录/子目录来组织项目,但由于我是一个新的开发者,我最近刚开始涉足第三方库而且我不确定如何组织它们。我会使用大量文件夹并构建一个巨大的层次结构,但这样做可能会导致我的源代码的#includes中有一些非常长的绝对路径。有什么建议吗?

2 个答案:

答案 0 :(得分:0)

您有两个选择:

  1. 使用系统安装的库(和标题),告诉编译器在哪里找到它们。
  2. 使用项目中的文件夹(使用文件夹./external存储外部源,例如./external/boost-asio用于Boost ASIO库),在初始化项目时下载源代码(我更喜欢使用git submodules下载外部资源),并使用您的项目构建它们。
  3. CMAKE是一个构建工具,可以帮助您实现这两个目标。

    无论哪种方式,正如 jtbandes 所写,不要使用绝对路径。

答案 1 :(得分:0)

第三方库可以随心所欲,只要您确保编译器和编译的程序都能找到所需的文件。因此,只要您确保将此信息告诉编译器和已编译的程序,您就可以随心所欲地组织文件。

具体如何执行此操作取决于您使用的IDE(集成开发环境)。我使用visual studio,所以如果你使用其他东西,确切的术语可能会有所不同。在visual studio中,您必须转到项目的属性才能执行此操作。

有关外部库的头文件,请转到配置属性> C / C ++>一般并单击"其他包含目录"。如果编辑此字段的值,则可以将路径添加到外部库的include目录,该目录应包含外部库的所有头文件。通过使用Visual Studio提供的宏,您可以使这些路径相对,这样您在移动项目时就不必全面执行此操作。确保你没有删除"%(AdditionalIncludeDirectories)"。还要确保窗口顶部的所选配置和平台与您尝试编译的配置和平台相匹配。使用宏可以同时为所有配置和平台设置它,这有点困难,但从长远来看,它可以节省您的时间。我的一个项目的一个例子:

$(SolutionDir)dependencies\SDL2_image-2.0.1\include;$(SolutionDir)dependencies\SDL2-2.0.5\include;%(AdditionalIncludeDirectories)

对于库文件,您需要转到配置属性>链接器>一般并点击"其他图书馆目录"。编辑此值以添加外部库的lib文件夹的路径。您可以在此处再次使用宏。

$(SolutionDir)dependencies\SDL2-2.0.5\lib\x64;$(SolutionDir)dependencies\SDL2_image-2.0.1\lib\x64;%(AdditionalLibraryDirectories)

接下来,转到配置属性>链接器>输入和编辑"其他依赖关系"添加所需的.lib文件的名称。这次只是文件名,你不需要这里的路径。我的一个项目的一个例子:

SDL2main.lib;SDL2.lib;SDL2_image.lib;%(AdditionalDependencies)

最后,您需要确保已编译的程序可以找到外部库的.dll文件。为此,您可以使用像PATH等系统变量,但我不建议这样做。我更喜欢使用Post-Build事件。像这样的事件基本上是在编译程序之后执行的一系列命令行命令。您可以转到配置属性>添加此事件。构建活动>构建后事件和编辑"命令行"。您可以从我的一个项目中放置一个示例,如下所示:

copy /Y "$(SolutionDir)dependencies\SDL2_image-2.0.1\lib\$(PlatformTarget)\*.dll" "$(TargetDir)*.dll"
copy /Y "$(SolutionDir)dependencies\SDL2-2.0.5\lib\$(PlatformTarget)\SDL2.dll" "$(TargetDir)SDL2.dll"
xcopy /Y /S /E /I "$(SolutionDir)assets" "$(TargetDir)assets"

请注意,我再次使用宏:$(SolutionDir),$(PlatformTarget),$(TargetDir)分别替换为Configuration和Platform的每个组合的解决方案目录,平台目标和目标目录。