Qt5项目CMake编译报错:链接找不到engine-lib的原因排查
问题根源与修复方案
嘿,我一眼就看到问题出在哪了——你在src/CMakeLists.txt里用错了add_subdirectory命令!
为什么加Qt5Sql后会报错?
看你这行代码:
add_subdirectory( db engine )
add_subdirectory的语法是一次只能添加一个子目录,第二个参数是用来指定这个子目录的编译产物输出路径的,不是用来同时添加多个子目录的。这行代码的实际效果是:
- 只把
db子目录加入了构建流程 - 把
db的编译文件都放到了engine目录下 - 完全没处理
engine子目录!
这就解释了为什么移除db相关配置后能正常编译——那时候你相当于跳过了这行错误的命令,CMake才会正确处理engine子目录,构建出engine-lib。而当你加入Qt5Sql并启用db子目录时,这行错误的命令直接把engine子目录的构建给跳过了,链接器自然找不到engine-lib。
怎么修复?
把src/CMakeLists.txt里的子目录添加代码改成分开写:
include(Qt) # 分别添加db和engine两个子目录,不要合并成一行 add_subdirectory(db) add_subdirectory(engine) add_executable(blacklist-engine-cli main.cpp) target_link_libraries( blacklist-engine-cli Qt5::Core Qt5::Sql engine-lib db-lib )
这样CMake会分别处理两个子目录,正确构建db-lib和engine-lib两个库,链接器就能找到需要的文件了。
额外小提示
你的db-lib已经通过target_link_libraries依赖了Qt5::Sql,其实blacklist-engine-cli不需要再重复链接Qt5::Sql——CMake会自动传递依赖关系,不过重复写也不会导致问题,只是有点冗余。
验证步骤
先清空build目录避免缓存影响:
rm -rf build/*
然后重新构建:
cd build && cmake .. && make
应该就能顺利编译通过了!
内容的提问来源于stack exchange,提问作者mordes
相关产品推荐
相关产品推荐

