conan2 基础入门(06)-conanfile.py入门
⭐准备
注意,如果想跟好的学习conanfile.py
建议使用python来安装conan。
当然使用其他方式安装也是有效果的。
预备文件和Code
文件名预览
:.
│ CMakeLists.txt
│ conanfile.py
└─ main.cpp
main.cpp
#include <json/json.h>
#include <iostream>
void test_env() {
std::cout << ">>>" << __func__ << std::endl;
std::cout << "sizeof(void*) = " << sizeof(void *) << std::endl;
#if defined(_MSC_VER)
// msvc的判断方式
#ifdef _DEBUG
std::cout << "Debug version" << std::endl;
#else
std::cout << "Release version" << std::endl;
#endif
std::cout << "_MSC_VER = " << _MSC_VER << std::endl;
#endif
}
void test_jsoncpp(void) {
std::cout << ">>>" << __func__ << std::endl;
Json::Value up;
up["name"] = "cuber-lotus";
up["bilibili"] = "https://space.bilibili.com/8172252";
std::cout << "up: " << up << std::endl;
}
int main(void) {
test_env();
test_jsoncpp();
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.15)
project(mydemo CXX)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin)
find_package(jsoncpp REQUIRED)
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} JsonCpp::JsonCpp)
conanfile.py
import os
from conan import ConanFile
from conan.tools.files import copy
class MyConanFile(ConanFile):
'''
继承 class ConanFile
'''
settings = "os", "compiler", "build_type", "arch"
generators = "CMakeToolchain", "CMakeDeps"
# 设置`shared`属性可以为[True, False]
options = {"shared": [True, False]}
# 为options中的属性设置默认值
default_options = {"shared": True}
def requirements(self):
self.requires("jsoncpp/1.9.5")
def generate(self):
# 如果采用动态库的方式
# 将动态库复制到可执行文件目录下
if not self.options.shared:
return
for dep in self.dependencies.values():
for depDll in dep.cpp_info.bindirs:
print(">>>")
print(">>>", depDll)
print(">>>")
copy(self, "*.dll", depDll,
os.path.join(self.source_folder, "bin/Release"))
⭐使用
流程指令
@REM -o jsoncpp*:shared=True 在conan install 命令行显示的指定动态库
conan install . --output-folder=build --build=missing -o jsoncpp*:shared=True
cd build
cmake .. -G "Visual Studio 16 2019" -DCMAKE_TOOLCHAIN_FILE="conan_toolchain.cmake"
cmake --build . --config Release
cd ../bin/Release
mydemo.exe
⭐具体讲解
conanfile.py
首先这是一个脚本性质的文件,不是一个完整运行的程序。
重点在于from conan import ConanFile
。
class 继承(ConanFile)
我们只需要继承class ConanFile
进行特化即可。
settings
这里对应好使用的profile文件的内容
settings = "os", "compiler", "build_type", "arch"
generators
这里是为了使用cmake。于conanfile.txt
中的generators
一致。
generators = "CMakeToolchain", "CMakeDeps"
options
选项设置,属于辅助变量。规定当前的脚本需要的选项。
# 设置`shared`属性可以为[True, False]
options = {"shared": [True, False]}
default_options
默认的属性,与options对应。
# 为options中的属性设置默认值
default_options = {"shared": True}
requirements()
The requirements() method is used to specify the dependencies of a package.
requirements() 方法用于指定包的依赖项。
def requirements(self):
self.requires("jsoncpp/1.9.5")
generate()
This method will run after the computation and installation of the dependency graph.
This means that it will run after a conan install command, or when a package is being built in the cache, it will be run before calling the build() method.
该函数会在计算和安装依赖图后运行。
这就意味着这会在conan install
执行之后运行,或者当一个包在缓存中构建之后,generate()
会在build()
前运行。
# 注:此处是与本文最上面的精简版。
def generate(self):
# 将动态库复制到可执行文件目录下
for dep in self.dependencies.values():
for depDll in dep.cpp_info.bindirs:
copy(self, "*.dll", depDll,
os.path.join(self.source_folder, "bin/Release"))
conan install
指定生成动态库
在python脚本中的选项仅是做脚本编码时的辅助。
真正需要指定生成动态库需要在conan install执行中指定。
conanfile.txt
也可以这么操作,但其本身支持在配置中指定动态库。
conan install . \
--output-folder=build \
--build=missing \
-o jsoncpp*:shared=True
END
视频教学
conan2.0 基础入门 (主流的C/C++包管理工具)_哔哩哔哩_bilibili
![]()
关注我,学习更多C/C++,算法,计算机知识
B站:
👨💻主页:天赐细莲 bilibili
![]()