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

