使用 Conan 构建多编译器 C/C++ 应用程序
Conan 0.16 引入了一项功能,允许您覆盖依赖项图中特定 Conan 包的任何设置。还允许指定在 conan install
命令期间设置的环境变量。
该功能源于 Conan GitHub 存储库中的问题(一项功能请求)。用户希望使用 Windows 中的 gcc(MinGW)构建其项目的一些依赖项,但使用 Visual Studio 编译其项目。当我们阅读这个问题时,首先想到的是,什么?这可能吗?答案是肯定的,即使纯 C 库是用不同的编译器构建的,它们也可能是兼容的。
当我们实现并开始使用此功能时,我们意识到包特定设置和环境变量与配置文件功能的组合非常强大。
混合编译器
让我们看一个例子。我们将使用 gcc 4.9 编译器(我的 Linux 机器上的原生编译器)构建 OpenSSL Conan 包,但使用 clang 编译器(安装在 /usr/bin/clang)构建 zlib 依赖项。
我们可以使用命令行参数来指定它,但为了方便起见,让我们先在 ~/.conan/profiles/openssl 中创建一个名为“openssl”的配置文件(可以使用任何名称)。
[settings]
compiler=gcc
compiler.version=4.9
zlib:compiler=clang
zlib:compiler.version=3.5
[env]
zlib:CXX=/usr/bin/clang++
zlib:CC=/usr/bin/clang
CXX
和 CC
环境变量被 CMake 或 autotools 等构建工具用来定位要使用的编译器。
我们只需要上述配置文件来混合两个不同的编译器,但让我们编写一个 OpenSSL
示例代码作为测试项目,以查看它的实际效果。
在新的文件夹中创建一个包含简单 OpenSSL 测试程序的 main.c
文件。
#include <stdio.h>
#include <string.h>
#include "openssl/md5.h"
#include "openssl/crypto.h"
#include "zlib.h"
int main(){
unsigned char digest[MD5_DIGEST_LENGTH];
char string[] = "happy";
MD5((unsigned char*)&string, strlen(string), (unsigned char*)&digest);
char mdString[33];
int i;
for(i = 0; i < 16; i++)
sprintf(&mdString[i*2], "%02x", (unsigned int)digest[i]);
printf("md5 digest: %s\n", mdString);
printf("SSL library version: %s\n", SSLeay_version(SSLEAY_VERSION));
printf("ZLIB version: %s\n", ZLIB_VERSION);
return 0;
}
编写一个简单的 CMakeLists.txt
来构建示例。
project(MyHello)
cmake_minimum_required(VERSION 2.8)
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()
add_executable(md5 main.c)
target_link_libraries(md5 ${CONAN_LIBS})
编写一个包含所需包的 conanfile.txt
。
[requires]
OpenSSL/1.0.2i@lasote/stable
[generators]
cmake
然后,您可以运行 conan install 命令,并指定要使用的配置文件,并使用“–build”强制构建项目依赖项。
$ mkdir build && cd build
$ conan install --build --profile openssl ../
调用 CMake 来构建示例项目。
$ cmake ../ -DCMAKE_BUILD_TYPE=Release
$ cmake --build .
最后,运行示例。
$ ./bin/md5
md5 digest: 56ab24c15b72a457069c5ea42fcfc640
SSL library version: OpenSSL 1.0.2i 22 Sep 2016
ZLIB version: 1.2.8
实际上,您可以在不使用 Conan 配置文件的情况下使用此功能,您需要将所有参数传递给 conan install
命令。
$ conan install --build -s compiler=gcc -s compiler.version=4.9 -s zlib:compiler=clang -s zlib:compiler.version=3.5 -e zlib:CXX=/usr/bin/clang++ -e zlib:CC=/usr/bin/clang
管理构建环境
通过在包级别定义的环境变量,我们可以调整整个构建环境,例如,我们可以为每个包使用不同的 CMake 版本,方法是设置 PATH
环境变量,使其指向不同包的不同 CMake 安装位置。
[env]
package1:PATH=/my/path/to/cmake/3.5.0/bin
package2:PATH=/my/path/to/cmake/2.8.0/bin
package2:PATH=/my/path/to/other_tools
结论
这些新功能赋予 Conan 强大的灵活性来控制构建环境,不仅控制每个包的设置和选项,还控制项目和依赖项构建中涉及的所有工具。
您对此功能有任何其他建议吗?请提供反馈或在 GitHub 上贡献。