如何使用Conan2为ARMv7架构编译SQLite依赖库?
我有一个包含SQLite的简单C++项目,代码如下:
#include <iostream> #include <sqlite3.h> int main() { sqlite3 *db; int rc = sqlite3_open("test.db", &db); if (SQLITE_OK == rc) { std::cout << "Opened SQLite database successfully!\n"; std::string sql = "insert into person values(3, 'Bob', 2);"; int exit = 0; char* messaggeError; exit = sqlite3_exec(db, sql.c_str(), NULL, 0, &messaggeError); if (exit != SQLITE_OK) { std::cerr << "Error insert Table" << std::endl; sqlite3_free(messaggeError); } else { std::cout << "Table inserted Successfully" << std::endl; } sqlite3_close(db); } else { std::cout << "Can't open the SQLite database: " << sqlite3_errmsg(db) << "\n"; } return 0; }
使用Conan2(版本1.10)为ARMv7架构编译该项目,SQLite作为远程依赖,conanfile.txt配置:
[requires] sqlite3/3.47.1 [generators] CMakeDeps CMakeToolchain
CMakeLists.txt配置:
cmake_minimum_required (VERSION 3.8) project(TestConan CXX) set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++) find_package(SQLite3 REQUIRED) add_executable(testConan test_conan.cpp) target_link_libraries(testConan SQLite::SQLite3)
执行命令:
conan install . --output-folder=build --build="*" --options="*:shared=True"
后发现Conan使用系统x86-64编译器(/usr/bin/cc)编译SQLite,生成的libsqlite3.so为x86-64架构:
./p/b/sqlit1d7e869180ce4/b/build/Release/libsqlite3.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=ecceb2e5756e9e3bf285262dc3ffb2a15b910576, not stripped
需要配置让Conan使用正确的arm-linux-gnueabihf-gcc编译器为ARMv7架构编译依赖库。
核心问题是未给Conan指定交叉编译的Profile,导致Conan默认用本地主机架构编译依赖。按以下步骤修改配置:
1. 创建Conan交叉编译Profile文件
在项目根目录(或~/.conan/profiles/目录)创建名为armv7hf的Profile文件,内容如下:
[settings] os=Linux arch=armv7hf compiler=gcc compiler.version=12 # 替换为你的arm-linux-gnueabihf-gcc实际版本 compiler.cppstd=14 compiler.libcxx=libstdc++11 [conf] tools.build:compiler_executables={"c": "arm-linux-gnueabihf-gcc", "cpp": "arm-linux-gnueabihf-g++"}
注意:
compiler.version需与arm-linux-gnueabihf-gcc --version输出的版本一致,比如gcc 9就写9。
2. 修改CMakeLists.txt,移除硬编码编译器
不要在CMakeLists.txt中直接设置CMAKE_CXX_COMPILER,Conan的CMakeToolchain会自动从Profile传递编译器信息,硬编码会覆盖配置。修改后的内容:
cmake_minimum_required (VERSION 3.8) project(TestConan CXX) set(CMAKE_CXX_STANDARD 14) find_package(SQLite3 REQUIRED) add_executable(testConan test_conan.cpp) target_link_libraries(testConan SQLite::SQLite3)
3. 指定Profile执行Conan安装命令
运行conan install时通过--profile参数指定交叉编译Profile:
conan install . --output-folder=build --build="*" --options="*:shared=True" --profile:build=default --profile:host=armv7hf
说明:
--profile:build=default表示用本地编译器编译Conan的构建辅助工具,--profile:host=armv7hf表示用ARM编译器编译目标依赖和项目。
4. 验证编译结果
编译完成后,检查生成的SQLite库架构:
file build/p/b/sqlit*/b/build/Release/libsqlite3.so
正常输出应该为:ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked...
内容的提问来源于stack exchange,提问作者Артём Липаткин

