2017-09-05 68 views
1

我想提供编译为项目一部分的所有外部库,以便用户不必下载任何内容。我正在使用CMake来管理项目。我遇到了SDL2的问题。它的包含文件对于不同的平台是相同的,除了构建SDL2本身时生成的“SDL_config.h”,并且依赖于编译器/平台。在项目中为Win和Linux提供SDL2头文件

因此我需要提供两个SDL_config.h文件 - 一个用于windows,一个用于linux。如果我也想自动生成过程中,我提出了两个思路:

  1. 放入SDL头文件的IFDEF _WIN32/UNIX条款,包括适当的SDL_config.h文件

  2. 保持SDL文件完好无损,并作出构建脚本会把正确SDL_config.h文件在include目录

什么是做我想要什么的最优雅/通常的方式?

回答

1

把一个IFDEF _WIN32/UNIX子句中的SDL头文件包含相应的SDL_config.h文件

修改库文件这样的问题不应该是一个选项,或至少它应该成为你最后的资源。

保持SDL文件完好无损,并作出构建脚本会把正确SDL_config.h文件中您正在使用C进行包括目录

。您不需要构建脚本。


创建一个目录,并把那里的两个版本SDL_config.h。然后:

  • 如果你内心想要的复印过程中替换(无论路径或)有变数,可能cmake的命令configure_file是你在找什么:

    拷贝文件到另一个位置并修改其内容

  • 否则,如果所有你想要的是从到一个不同的位置上复制一个文件,cmake的命令file在其要走的路签名:

    COPY签名将文件,目录和符号链接复制到目标文件夹。

在这两种情况下,你必须使用一个WIN32MSVCUNIXwhatelse如果您CMakeLists.txt/else语句。相当恼人的写作和保持的确如此。


这就是说,你再次使用cmake。用它来结束。
您可以探索cmake模块ExternalProject,而不是为每个系统和编译器的每个组合提供每个依赖项的编译版本。通过使用它,您可以在cmake运行时下载和编译即时依赖项。
这是迄今为止更优雅的解决方案,它不要求用户在他们的机器上手动安装依赖关系。此外,维护更容易,并且根据您的CMakeLists.txt中的目标系统,您没有任何丑陋的if/else。

+0

谢谢,正是我想到的。 – pseudomarvin

相关问题