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 <iostream>
#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