多文件C项目CMakeLists.txt编写及链接错误解决咨询
解决多文件相互依赖的CMake链接错误问题
首先得指出你之前的CMakeLists.txt里一个关键问题:你把.h头文件也加到了SOURCE_EXE变量里,这完全没必要——CMake只需要知道你的源代码文件(.c),头文件会通过代码里的#include指令自动被识别和处理,强行把它们加到源文件列表里反而可能引发编译或链接异常。
针对你的项目(8个.c+8个.h,相互依赖),下面是正确的CMakeLists.txt写法,我会一步步解释:
# 建议使用较新的CMake版本,2.8太老旧了,很多现代特性不支持 cmake_minimum_required(VERSION 3.10) project(calc-2.4.0) # 只列出所有的.c源文件,不要包含.h文件 set(SOURCE_FILES main.c expmath.c interface.c container.c polnot.c error.c getelem.c dbg.c ) # 如果你的头文件和源文件在同一个目录,这一步可以省略;如果头文件在单独的目录(比如include/),需要指定路径 # include_directories(${PROJECT_SOURCE_DIR}/include) # 生成可执行文件,传入所有源文件 add_executable(${PROJECT_NAME} ${SOURCE_FILES})
为什么这样写能解决问题?
- 源文件与头文件分离:CMake会自动扫描每个
.c文件中的#include语句,找到对应的.h文件,并处理它们之间的依赖关系,不需要你手动把头文件加到编译列表里。 - 自动处理相互依赖:不管你的文件之间依赖关系多复杂,CMake都会在编译阶段自动确定编译顺序,确保每个文件编译时能找到它需要的头文件,链接阶段也会把所有目标文件正确链接到一起,不会出现未定义符号之类的链接错误(前提是你的代码本身没有语法或逻辑错误)。
额外注意事项
- 如果你的头文件不在源文件所在目录,一定要用
include_directories()指定头文件路径,否则编译器会找不到头文件,引发编译错误。 - 如果你之前的链接错误是因为部分源文件没被加入编译列表,那上面的写法把所有
.c都加进去后,这个问题就会解决。 - 尽量升级你的CMake版本到3.x以上,2.8版本已经停止维护很多年了,兼容性和稳定性都不如新版本。
内容的提问来源于stack exchange,提问作者EveHo
相关产品推荐
相关产品推荐

