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

CMake编译C++项目出现undefined reference错误,手动Makefile可正常编译

解决CMake编译时自定义类函数的undefined reference错误

你的问题根源很明确——CMake没有把src/cpp目录下的类实现文件(index.cpp、record.cpp)加入编译流程,导致链接器找不到这些函数的定义,才抛出了undefined reference错误。

问题出在哪?

看你CMakeLists.txt里的这行:

file(GLOB SOURCES "${PROJECT_SOURCE_DIR}/src/cpp")

你只指定了目录路径,没有添加文件匹配模式(比如*.cpp),这会导致SOURCES变量里只存了src/cpp这个目录名,而不是目录下的所有.cpp源文件。后续生成可执行文件时,CMake只编译了main.cpp,完全没处理那两个类的实现文件,链接阶段自然找不到对应的函数。

修正方案

把file(GLOB)的路径改成匹配目录下的所有.cpp文件,修改后的关键代码如下:

# 修正GLOB匹配规则,获取src/cpp下所有cpp文件
file(GLOB SOURCES "${PROJECT_SOURCE_DIR}/src/cpp/*.cpp")
add_executable(indexer "${PROJECT_SOURCE_DIR}/src/main.cpp" ${SOURCES})

更严谨的替代方案(推荐)

file(GLOB)虽然方便,但有个局限性:当你在src/cpp目录新增或删除文件时,CMake不会自动感知到变化,需要手动重新运行cmake ..。如果项目需要长期维护,更推荐显式列出所有源文件,这样CMake能准确跟踪文件变化:

# 显式列出所有需要编译的源文件
set(SOURCES
    ${PROJECT_SOURCE_DIR}/src/cpp/index.cpp
    ${PROJECT_SOURCE_DIR}/src/cpp/record.cpp
)
add_executable(indexer "${PROJECT_SOURCE_DIR}/src/main.cpp" ${SOURCES})

验证步骤

修改完CMakeLists.txt后,进入build目录,重新执行:

cmake ..
make

这次应该就能像手动写Makefile一样正常编译链接了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:05:10