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

Flutter/Dart FFI嵌入多文件C库:是否需在CMakeLists中列全C文件?

问题解答

是的,你必须在CMakeLists.txt的add_library指令中列出所有需要编译的C源文件——哪怕你的入口文件已经引用了其他文件。

原因说明

CMake不会自动扫描并识别项目中所有的源文件,它完全依赖你明确指定要编译的文件集合。如果只列出入口文件,那些未被声明的C文件不会被编译成目标文件,在最终链接动态库时,会出现未定义符号的错误——因为这些文件里的函数实现根本没被包含进库中。

优化方式(避免逐个列文件)

如果是大型库,手动逐个列出文件效率太低,可以用CMake的文件匹配指令批量获取源文件:

  • file(GLOB):匹配指定目录下的目标文件
  • file(GLOB_RECURSE):递归匹配指定目录及其子目录下的目标文件

示例修改后的CMakeLists.txt:

cmake_minimum_required(VERSION 3.4.1)

# 递归获取../../src目录下所有.c文件
file(GLOB_RECURSE ALL_C_SOURCES ../../src/*.c)

add_library(
            weather
            SHARED
            ${ALL_C_SOURCES}
)

注意事项

  • 使用GLOB类指令时,若后续新增或删除了源文件,需要重新运行CMake(或执行flutter clean后重新构建),否则CMake不会自动感知文件变化。
  • 如果你需要排除某些文件,可以在匹配后用list(REMOVE_ITEM)指令移除不需要的文件路径。

内容的提问来源于stack exchange,提问作者Markus Bach

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 01:35:18