应该在哪里放置第三方库?

joe*_*_04 6 c++ organization libraries

问这个问题似乎有点荒谬,但我正在努力为此找到一个好的系统。是否有用于存储和组织第三方开发库的标准化系统?我深受强迫症困扰,认为自己是一个“整洁的怪胎”,所以我倾向于使用大量目录/子目录来组织项目,但由于我是一个新的开发人员,我最近才开始涉足 3rd 方库我不知道如何组织它们。我会使用大量文件夹并创建一个巨大的层次结构,但是这样做可能会导致#includes我的源代码中的绝对路径非常长。有什么建议?

小智 1

第三方库可以去任何你想去的地方,只要你确保编译器和编译后的程序都能找到它们需要的文件。因此,只要您确保将这一点告诉编译器和编译后的程序,您就可以按照自己想要的方式组织文件。

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

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

$(SolutionDir)dependencies\SDL2_image-2.0.1\include;$(SolutionDir)dependencies\SDL2-2.0.5\include;%(AdditionalIncludeDirectories)
Run Code Online (Sandbox Code Playgroud)

对于库文件,您需要转到“配置属性”>“链接器”>“常规”,然后单击“其他库目录”。编辑此值以添加外部库的 lib 文件夹的路径。您可以在这里再次使用宏。

$(SolutionDir)dependencies\SDL2-2.0.5\lib\x64;$(SolutionDir)dependencies\SDL2_image-2.0.1\lib\x64;%(AdditionalLibraryDirectories)
Run Code Online (Sandbox Code Playgroud)

接下来,转到“配置属性”>“链接器”>“输入”并编辑“其他依赖项”以添加所需的 .lib 文件的名称。这次只需文件名,不需要此处的路径。我的一个项目的一个例子:

SDL2main.lib;SDL2.lib;SDL2_image.lib;%(AdditionalDependencies)
Run Code Online (Sandbox Code Playgroud)

最后,您需要确保编译的程序可以找到外部库的 .dll 文件。为此,您可以使用 PATH 等系统变量,但我不建议这样做。我更喜欢使用构建后事件。像这样的事件基本上是在编译程序后执行的一系列命令行命令。您可以通过转到配置属性 > 构建事件 > 构建后事件并编辑“命令行”来添加此事件。下面显示了我的一个项目中可以放在这里的示例:

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"
Run Code Online (Sandbox Code Playgroud)

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