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

多子目录下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.cpp
  • VulkanApplication.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 10:56:04