多子目录下CMake编译C++项目遇链接错误求助
链接错误:undefined reference to
createInstance() 问题排查与解决 目录结构
CMakeLists.txt src --main.cpp --VulkanApplication.cpp & .h --vk_utils ----instance_utils.cpp ----vk_utils.h
代码调用逻辑
main.cpp实例化VulkanApplication对象并调用run()run()调用initVulkan()initVulkan()调用createInstance(),该函数声明在vk_utils/vk_utils.h,实现于vk_utils/instance_utils.cppVulkanApplication.cpp已包含vk_utils/vk_utils.h
使用的CMakeLists.txt
cmake_minimum_required(VERSION 3.5) project(VKRaytracer CXX) set(SOURCE_FILES src/main.cpp src/VulkanApplication.cpp src/vk_utils/instance_utils.cpp ) add_executable(${PROJECT_NAME} ${SOURCE_FILES}) target_link_libraries(${PROJECT_NAME} glfw vulkan dl pthread X11 Xxf86vm Xrandr Xi)
链接阶段错误信息
[build] ld: CMakeFiles/VKRaytracer.dir/src/VulkanApplication.cpp.o: in function `VulkanApplication::initVulkan()': [build] src/VulkanApplication.cpp:20:(.text+0x1): undefined reference to `createInstance()' [build] collect2: error: ld returned 1 exit status
最小示例代码
main.cpp
#include "VulkanApplication.h" int main() { VulkanApplication app; app.run(); }
VulkanApplication.cpp
#include "VulkanApplication.h" #include "vk_utils/vk_utils.h" void VulkanApplication::run() { this->initVulkan(); } void VulkanApplication::initVulkan() { createInstance(); }
VulkanApplication.h
#ifndef VULKAN_APPLICATION_H #define VULKAN_APPLICATION_H class VulkanApplication { public: void run(); private: void initVulkan(); }; #endif
vk_utils/vk_utils.h
#ifndef INSTANCE_UTILS #define INSTANCE_UTILS void *createInstance(); // 改为void*是为了不依赖外部库做验证 #endif
vk_utils/instance_utils.cpp
#include "vk_utils.h" void* create_instance() { return nullptr; }
问题根源
你犯了一个C++基础错误:函数声明和实现的名字不匹配。
- 头文件里声明的是
createInstance()(驼峰命名) - 源文件里实现的是
create_instance()(下划线命名)
C++是区分大小写的,链接器找不到createInstance()的实现,自然报未定义引用错误。你的CMakeLists.txt配置是正确的——已经把所有源文件都加入了编译列表,问题和CMake无关。
修复步骤
只需要把instance_utils.cpp里的函数名改成和头文件一致:
#include "vk_utils.h" void* createInstance() // 修改为与头文件声明一致的函数名 { return nullptr; }
重新执行CMake构建,链接错误就会消失。
内容的提问来源于stack exchange,提问作者C. Dautermann
相关产品推荐
相关产品推荐

