You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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,提问作者Артём Липаткин

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 16:11:21