• conan2 基础入门(04)-指定编译器(gcc为例)


    conan2 基础入门(04)-指定编译器(gcc为例)

    ⭐准备

    生成profile文件

    # 生成默认profile文件,名字为`default`
    # --force 表示强制生成,即若原来有`default`会被覆盖
    # --name 表示指定生成名称
    conan profile detect
    conan profile detect --force
    conan profile detect --name <指定名称>
    
    # 查看名为`default`的profile文件的路径
    conan profile path default
    conan profile path <名称>
    
    # 查看已经存在的eprofile
    conan profile list
    

    预备文件和Code

    profile文件:mygcc

    可以用命令生成,也可以直接复制一份已存在的profile,或者直接自己新建一个空白文件都行。

    并修改成如下的配置,注意,请根据自己平台的gcc进行配置。

    注意:不同编译器的具体compiler参数是不一样的。具体参见配置目录下的settings.yml

    conan profile detect --name "mygcc"
    
    [settings]
    arch=x86_64
    build_type=Release
    compiler=gcc
    compiler.cppstd=17
    compiler.version=11
    compiler.libcxx=libstdc++11
    os=Windows
    
    # 本文使用gcc版本
    gcc (x86_64-posix-seh-rev3, Built by MinGW-W64 project) 11.2.0
    

    文件名预览

    :.
    │  CMakeLists.txt
    │  conanfile.txt
    └─ main.cpp
    

    main.cpp

    #include 
    
    #include "zlib.h"
    
    void test_env() {
        std::cout << ">>>" << __func__ << std::endl;
        std::cout << "sizeof(void*) = " << sizeof(void *) << std::endl;
    #if defined(__VERSION__)
        std::cout << "__VERSION__ = " << __VERSION__ << std::endl;
    #elif defined(_MSC_VER)
        std::cout << "_MSC_VER = " << _MSC_VER << std::endl;
    #endif
    }
    
    void test_zlib(void) {
        std::cout << ">>>" << __func__ << std::endl;
    
        char buffer_in[256] = {
            "Conan is a MIT-licensed, Open Source package manager for C and C++ development"
            "for C and C++ development, allowing development teams to easily and efficiently"
            "manage their packages and dependencies across platforms and build systems."};
        char buffer_out[256] = {0};
    
        z_stream defstream;
        defstream.zalloc    = Z_NULL;
        defstream.zfree     = Z_NULL;
        defstream.opaque    = Z_NULL;
        defstream.avail_in  = (uInt)strlen(buffer_in);
        defstream.next_in   = (Bytef *)buffer_in;
        defstream.avail_out = (uInt)sizeof(buffer_out);
        defstream.next_out  = (Bytef *)buffer_out;
        deflateInit(&defstream, Z_BEST_COMPRESSION);
        deflate(&defstream, Z_FINISH);
        deflateEnd(&defstream);
    
        printf("Uncompressed size is: %lu\n", strlen(buffer_in));
        printf("Compressed size is: %lu\n", strlen(buffer_out));
        printf("ZLIB VERSION: %s\n", zlibVersion());
    }
    
    int main(void) {
        test_env();
        test_zlib();
    }
    

    CMakeLists.txt

    cmake_minimum_required(VERSION 3.15)
    project(mydemo CXX)
    
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin)
    
    find_package(ZLIB REQUIRED)
    
    add_executable(${PROJECT_NAME} main.cpp)
    
    target_link_libraries(${PROJECT_NAME} ZLIB::ZLIB)
    

    conanfile.txt

    [requires]
    zlib/1.3.1
    
    [generators]
    CMakeDeps
    CMakeToolchain
    

    ⭐使用

    指令预览

    流程化指令,run.bat

    如果你和上文中的代码和配置文件编写一致,请无脑直接操作以下命令。

    conan install . --output-folder=build --build=missing --profile:host=mygcc --profile:build=mygcc
    
    cd build
    
    cmake .. -G "MinGW Makefiles" -DCMAKE_TOOLCHAIN_FILE="conan_toolchain.cmake" -DCMAKE_BUILD_TYPE="Release"
    
    cmake --build . --config Release
    
    cd ../bin
    
    mydemo.exe
    

    正确执行结果

    >>>test_env
    sizeof(void*) = 8
    __VERSION__ = 11.2.0
    >>>test_zlib
    Uncompressed size is: 231
    Compressed size is: 19
    ZLIB VERSION: 1.3.1
    

    可能出现的问题

    • profile文件的参数错误,见附录
    • 有中文路径
    • 指令缺失
    • release&debug模式没匹配

    ⭐具体讲解

    conan

    指定profile

    在install命令下添加--profile

    conan install . --output-folder=build --build=missing --profile=mygcc
    conan install . --output-folder=build --build=missing --profile:host=mygcc --profile:build=mygcc
    

    这里的第二条分别制定了host和build

    • host 表示目标平台

    • build 表示当前平台

    一般这个在交叉编译时非常重要。在本示例中可以不指定。

    若不指定,经测试host为mygcc配置,build为default状态。

    cmake

    这里使用mingw32-make。注意在生成时区别于使用msvc时,需要指定-DCMAKE_BUILD_TYPE="Release"

    cmake .. -G "MinGW Makefiles" -DCMAKE_TOOLCHAIN_FILE="conan_toolchain.cmake" -DCMAKE_BUILD_TYPE="Release"
    
    cmake --build . --config Release
    



    END

    settings.yml

    # 在配置home下的 `settings.yml`
    conan config home
    
    C:\Users\{用户名}\.conan2\settings.yml
    
    # This file was generated by Conan. Remove this comment if you edit this file or Conan
    # will destroy your changes.
    os:
        Windows:
            subsystem: [null, cygwin, msys, msys2, wsl]
        WindowsStore:
            version: ["8.1", "10.0"]
        WindowsCE:
            platform: [ANY]
            version: ["5.0", "6.0", "7.0", "8.0"]
        Linux:
        iOS:
            version: &ios_version
                       ["7.0", "7.1", "8.0", "8.1", "8.2", "8.3", "9.0", "9.1", "9.2", "9.3", "10.0", "10.1", "10.2", "10.3",
                        "11.0", "11.1", "11.2", "11.3", "11.4", "12.0", "12.1", "12.2", "12.3", "12.4",
                        "13.0", "13.1", "13.2", "13.3", "13.4", "13.5", "13.6", "13.7",
                        "14.0", "14.1", "14.2", "14.3", "14.4", "14.5", "14.6", "14.7", "14.8",
                        "15.0", "15.1", "15.2", "15.3", "15.4", "15.5", "15.6", "16.0", "16.1",
                        "16.2", "16.3", "16.4", "16.5", "16.6", "17.0", "17.1"]
            sdk: ["iphoneos", "iphonesimulator"]
            sdk_version: [null, "11.3", "11.4", "12.0", "12.1", "12.2", "12.4",
                            "13.0", "13.1", "13.2", "13.4", "13.5", "13.6", "13.7",
                            "14.0", "14.1", "14.2", "14.3", "14.4", "14.5", "15.0", "15.2", "15.4",
                            "15.5", "16.0", "16.1", "16.2", "16.4", "17.0", "17.1"]
        watchOS:
            version: ["4.0", "4.1", "4.2", "4.3", "5.0", "5.1", "5.2", "5.3", "6.0", "6.1", "6.2",
                        "7.0", "7.1", "7.2", "7.3", "7.4", "7.5", "7.6", "8.0", "8.1", "8.3", "8.4",
                        "8.5", "8.6", "8.7", "9.0", "9.1", "9.2", "9.3", "9.4", "9.5", "9.6",
                        "10.0", "10.1"]
            sdk: ["watchos", "watchsimulator"]
            sdk_version: [null, "4.3", "5.0", "5.1", "5.2", "5.3", "6.0", "6.1", "6.2",
                            "7.0", "7.1", "7.2", "7.4", "8.0", "8.0.1", "8.3", "8.5", "9.0", "9.1",
                            "9.4", "10.0", "10.1"]
        tvOS:
            version: ["11.0", "11.1", "11.2", "11.3", "11.4", "12.0", "12.1", "12.2", "12.3", "12.4",
                        "13.0", "13.2", "13.3", "13.4", "14.0", "14.2", "14.3", "14.4", "14.5",
                        "14.6", "14.7", "15.0", "15.1", "15.2", "15.3", "15.4", "15.5", "15.6",
                        "16.0", "16.1", "16.2", "16.3", "16.4", "16.5", "16.6", "17.0", "17.1"]
            sdk: ["appletvos", "appletvsimulator"]
            sdk_version: [null, "11.3", "11.4", "12.0", "12.1", "12.2", "12.4",
                            "13.0", "13.1", "13.2", "13.4", "14.0", "14.2", "14.3", "14.5", "15.0",
                            "15.2", "15.4", "16.0", "16.1", "16.4", "17.0", "17.1"]
        visionOS:
            version: ["1.0"]
            sdk: ["xros", "xrsimulator"]
            sdk_version: [null, "1.0"]
        Macos:
            version: [null, "10.6", "10.7", "10.8", "10.9", "10.10", "10.11", "10.12", "10.13", "10.14", "10.15",
                        "11.0", "11.1", "11.2", "11.3", "11.4", "11.5", "11.6", "11.7",
                        "12.0", "12.1", "12.2", "12.3", "12.4", "12.5", "12.6", "12.7",
                        "13.0", "13.1", "13.2", "13.3", "13.4", "13.5", "13.6",
                        "14.0", "14.1", "14.2", "14.3", "14.4"]
            sdk_version: [null, "10.13", "10.14", "10.15", "11.0", "11.1", "11.3", "12.0", "12.1",
                            "12.3", "13.0", "13.1", "13.3", "14.0"]
            subsystem:
                null:
                catalyst:
                    ios_version: *ios_version
        Android:
            api_level: [ANY]
        FreeBSD:
        SunOS:
        AIX:
        Arduino:
            board: [ANY]
        Emscripten:
        Neutrino:
            version: ["6.4", "6.5", "6.6", "7.0", "7.1"]
        baremetal:
        VxWorks:
            version: ["7"]
    arch: [x86, x86_64, ppc32be, ppc32, ppc64le, ppc64,
           armv4, armv4i, armv5el, armv5hf, armv6, armv7, armv7hf, armv7s, armv7k, armv8, armv8_32, armv8.3, arm64ec,
           sparc, sparcv9,
           mips, mips64, avr, s390, s390x, asm.js, wasm, sh4le,
           e2k-v2, e2k-v3, e2k-v4, e2k-v5, e2k-v6, e2k-v7,
           riscv64, riscv32,
           xtensalx6, xtensalx106, xtensalx7]
    compiler:
        sun-cc:
            version: ["5.10", "5.11", "5.12", "5.13", "5.14", "5.15"]
            threads: [null, posix]
            libcxx: [libCstd, libstdcxx, libstlport, libstdc++]
        gcc:
            version: ["4.1", "4.4", "4.5", "4.6", "4.7", "4.8", "4.9",
                        "5", "5.1", "5.2", "5.3", "5.4", "5.5",
                        "6", "6.1", "6.2", "6.3", "6.4", "6.5",
                        "7", "7.1", "7.2", "7.3", "7.4", "7.5",
                        "8", "8.1", "8.2", "8.3", "8.4", "8.5",
                        "9", "9.1", "9.2", "9.3", "9.4", "9.5",
                        "10", "10.1", "10.2", "10.3", "10.4", "10.5",
                        "11", "11.1", "11.2", "11.3", "11.4",
                        "12", "12.1", "12.2", "12.3",
                        "13", "13.1", "13.2"]
            libcxx: [libstdc++, libstdc++11]
            threads: [null, posix, win32]  # Windows MinGW
            exception: [null, dwarf2, sjlj, seh]  # Windows MinGW
            cppstd: [null, 98, gnu98, 11, gnu11, 14, gnu14, 17, gnu17, 20, gnu20, 23, gnu23]
        msvc:
            version: [170, 180, 190, 191, 192, 193]
            update: [null, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
            runtime: [static, dynamic]
            runtime_type: [Debug, Release]
            cppstd: [null, 14, 17, 20, 23]
            toolset: [null, v110_xp, v120_xp, v140_xp, v141_xp]
        clang:
            version: ["3.3", "3.4", "3.5", "3.6", "3.7", "3.8", "3.9", "4.0",
                      "5.0", "6.0", "7.0", "7.1",
                      "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18"]
            libcxx: [null, libstdc++, libstdc++11, libc++, c++_shared, c++_static]
            cppstd: [null, 98, gnu98, 11, gnu11, 14, gnu14, 17, gnu17, 20, gnu20, 23, gnu23]
            runtime: [null, static, dynamic]
            runtime_type: [null, Debug, Release]
            runtime_version: [null, v140, v141, v142, v143]
        apple-clang:
            version: ["5.0", "5.1", "6.0", "6.1", "7.0", "7.3", "8.0", "8.1", "9.0", "9.1",
                      "10.0", "11.0", "12.0", "13", "13.0", "13.1", "14", "14.0", "15", "15.0"]
            libcxx: [libstdc++, libc++]
            cppstd: [null, 98, gnu98, 11, gnu11, 14, gnu14, 17, gnu17, 20, gnu20, 23, gnu23]
        intel-cc:
            version: ["2021.1", "2021.2", "2021.3", "2021.4", "2022.1", "2022.2",
                      "2022.3", "2023.0", "2023.1", "2023.2", "2024.0",]
            update: [null, ANY]
            mode: ["icx", "classic", "dpcpp"]
            libcxx: [null, libstdc++, libstdc++11, libc++]
            cppstd: [null, 98, gnu98, "03", gnu03, 11, gnu11, 14, gnu14, 17, gnu17, 20, gnu20, 23, gnu23]
            runtime: [null, static, dynamic]
            runtime_type: [null, Debug, Release]
        qcc:
            version: ["4.4", "5.4", "8.3"]
            libcxx: [cxx, gpp, cpp, cpp-ne, accp, acpp-ne, ecpp, ecpp-ne]
            cppstd: [null, 98, gnu98, 11, gnu11, 14, gnu14, 17, gnu17]
        mcst-lcc:
            version: ["1.19", "1.20", "1.21", "1.22", "1.23", "1.24", "1.25"]
            libcxx: [libstdc++, libstdc++11]
            cppstd: [null, 98, gnu98, 11, gnu11, 14, gnu14, 17, gnu17, 20, gnu20, 23, gnu23]
    
    build_type: [null, Debug, Release, RelWithDebInfo, MinSizeRel]
    
    

    关注我,学习更多C/C++,算法,计算机知识

    B站:

    👨‍💻主页:天赐细莲 bilibili

  • 相关阅读:
    为什么重写Equals方法要重写HashCode方法
    kunpeng的aarch64架构cpu、openeuler系统、昇腾服务器适配文档转换功能(doc转docx、ppt转pptx)
    力扣练习——链表在线OJ
    人工智能如何提高转录效率
    录屏怎么把声音录进去?简单的方法来了!
    Qt 一个简单的word文档编辑器
    【Java面试】怎么防止缓存击穿的问题?
    闭包及底层原理
    linux内核编程入门之proc文件读写
    vue 项目npm 打包遇到的一些bug记录
  • 原文地址:https://blog.csdn.net/CUBE_lotus/article/details/138734176