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
相关产品推荐
相关产品推荐

