VS2013 ERROR LNK2019: unresolved external symbol

a784063999 2016-12-27 02:06:07
編譯時遇到錯誤, 文件都有加進Project, 不知道哪裏出問題, 部分代碼和完整錯誤提示如下.

context.h
#pragma once
#include <vector>
#include "loadVulkanAPI.h"

void createInstance();
void createDevice();
... // 省略


context.cpp
#include "context.h"
#include "config.h"
#include <FreeImage.h>

void createInstance()
{
loadVulkanBaseAPI();
... // 省略
vkSuccessOrDie(vkCreateInstance(&instanceCreateInfo, NULL, &instance), "Failed to create instance");
loadVulkanInstanceAPI(instance);
... // 省略
}

void createDevice()
{
... // 省略
vkSuccessOrDie(vkCreateDevice(gpu, &deviceCreateInfo, NULL, &device), "Failed to create Vulkan Device");
loadVulkanDeviceAPI(device);

// Gather physical device memory properties
vkGetPhysicalDeviceMemoryProperties(gpu, &deviceMemProps);
vkGetDeviceQueue(device, 0, 0, &graphicsQueue);
}
... // 省略


loadVulkanAPI.h
#pragma once
#define VK_USE_PLATFORM_WIN32_KHR
#define VK_NO_PROTOTYPES
#include "vulkan/vulkan.h"
#include "NativeLibrary.h"
#include "debugOutput.h"

bool loadVulkanBaseAPI();
bool loadVulkanInstanceAPI(VkInstance instance);
bool loadVulkanDeviceAPI(VkDevice device);
... // 省略


loadVulkanAPI.cpp
#include "loadVulkanAPI.h"

#define PVR_STR(x) #x
#define PVR_VULKAN_GET_INSTANCE_POINTER(instance, function_name) vk##function_name = (PFN_vk##function_name)vkGetInstanceProcAddr(instance, "vk" PVR_STR(function_name));
#define PVR_VULKAN_GET_DEVICE_POINTER(device, function_name) vk##function_name = (PFN_vk##function_name)vkGetDeviceProcAddr(device, "vk" PVR_STR(function_name));

static NativeLibrary vkLib("vulkan-1.dll");

bool initVulkan()
{
vkGetInstanceProcAddr = (PFN_vkGetInstanceProcAddr)vkLib.getFunction("vkGetInstanceProcAddr");
vkEnumerateInstanceExtensionProperties = (PFN_vkEnumerateInstanceExtensionProperties)vkLib.getFunction("vkEnumerateInstanceExtensionProperties");
vkEnumerateInstanceLayerProperties = (PFN_vkEnumerateInstanceLayerProperties)vkLib.getFunction("vkEnumerateInstanceLayerProperties");
vkCreateInstance = (PFN_vkCreateInstance)vkLib.getFunction("vkCreateInstance");
vkDestroyInstance = (PFN_vkDestroyInstance)vkLib.getFunction("vkDestroyInstance");
return true;
}

bool initVulkanInstance(VkInstance instance)
{
PVR_VULKAN_GET_INSTANCE_POINTER(instance, EnumerateDeviceLayerProperties);
... // 省略
return true;
}

bool initVulkanDevice(VkDevice device)
{
PVR_VULKAN_GET_DEVICE_POINTER(device, CreateRenderPass);
... // 省略
return true;
}
...// 省略


錯誤Output
1>context.obj : error LNK2019: unresolved external symbol "bool __cdecl loadVulkanBaseAPI(void)" (?loadVulkanBaseAPI@@YA_NXZ) referenced in function "void __cdecl createInstance(void)" (?createInstance@@YAXXZ)
1>context.obj : error LNK2019: unresolved external symbol "bool __cdecl loadVulkanInstanceAPI(struct VkInstance_T *)" (?loadVulkanInstanceAPI@@YA_NPAUVkInstance_T@@@Z) referenced in function "void __cdecl createInstance(void)" (?createInstance@@YAXXZ)
1>context.obj : error LNK2019: unresolved external symbol "bool __cdecl loadVulkanDeviceAPI(struct VkDevice_T *)" (?loadVulkanDeviceAPI@@YA_NPAUVkDevice_T@@@Z) referenced in function "void __cdecl createDevice(void)" (?createDevice@@YAXXZ)
...全文
312 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ipqtjmqj 2016-12-27
  • 打赏
  • 举报
回复
引用 9 楼 a784063999 的回复:
[quote=引用 8 楼 ipqtjmqj 的回复:] [quote=引用 7 楼 a784063999 的回复:] [quote=引用 6 楼 ipqtjmqj 的回复:] 你在loadVulkanAPI.cpp中有定义下面三个函数吗 bool loadVulkanBaseAPI(); bool loadVulkanInstanceAPI(VkInstance instance); bool loadVulkanDeviceAPI(VkDevice device);
懂了,原來我的函數名忘了改, 每次改名都要逐個地方改, 感謝, 結帖[/quote] 每次改名都要逐个地方改, 说明你的函数命名有问题, 可以考虑用namespace[/quote]我想不到函數或者變量叫甚麼名好就隨便打, 改天想到更適合的就想改, 但全部有引用過的地方, 聲明和定義都要改一遍[/quote] 名字尽量短, 怕重名外面包个namespace, 函数名一般是动词, 类名是名词. 而且c++有函数重载, 可以同名。 比如上面这三个函数, 可以都改名为load
a784063999 2016-12-27
  • 打赏
  • 举报
回复
引用 8 楼 ipqtjmqj 的回复:
[quote=引用 7 楼 a784063999 的回复:] [quote=引用 6 楼 ipqtjmqj 的回复:] 你在loadVulkanAPI.cpp中有定义下面三个函数吗 bool loadVulkanBaseAPI(); bool loadVulkanInstanceAPI(VkInstance instance); bool loadVulkanDeviceAPI(VkDevice device);
懂了,原來我的函數名忘了改, 每次改名都要逐個地方改, 感謝, 結帖[/quote] 每次改名都要逐个地方改, 说明你的函数命名有问题, 可以考虑用namespace[/quote]我想不到函數或者變量叫甚麼名好就隨便打, 改天想到更適合的就想改, 但全部有引用過的地方, 聲明和定義都要改一遍
ipqtjmqj 2016-12-27
  • 打赏
  • 举报
回复
引用 7 楼 a784063999 的回复:
[quote=引用 6 楼 ipqtjmqj 的回复:] 你在loadVulkanAPI.cpp中有定义下面三个函数吗 bool loadVulkanBaseAPI(); bool loadVulkanInstanceAPI(VkInstance instance); bool loadVulkanDeviceAPI(VkDevice device);
懂了,原來我的函數名忘了改, 每次改名都要逐個地方改, 感謝, 結帖[/quote] 每次改名都要逐个地方改, 说明你的函数命名有问题, 可以考虑用namespace
a784063999 2016-12-27
  • 打赏
  • 举报
回复
引用 6 楼 ipqtjmqj 的回复:
你在loadVulkanAPI.cpp中有定义下面三个函数吗 bool loadVulkanBaseAPI(); bool loadVulkanInstanceAPI(VkInstance instance); bool loadVulkanDeviceAPI(VkDevice device);
懂了,原來我的函數名忘了改, 每次改名都要逐個地方改, 感謝, 結帖
ipqtjmqj 2016-12-27
  • 打赏
  • 举报
回复
你在loadVulkanAPI.cpp中有定义下面三个函数吗 bool loadVulkanBaseAPI(); bool loadVulkanInstanceAPI(VkInstance instance); bool loadVulkanDeviceAPI(VkDevice device);
a784063999 2016-12-27
  • 打赏
  • 举报
回复
引用 4 楼 ipqtjmqj 的回复:
[quote=引用 3 楼 a784063999 的回复:]
[quote=引用 2 楼 shiyanbo_1006 的回复:]
就是库的设置问题

引用 1 楼 ipqtjmqj 的回复:
要设置链接库设置了吗

同Project的, 不用設置這個吧[/quote]
直接源代码才叫同Project, 你有编译loadVulkan.cpp, 光include头文件只是骗过编译器而已, 链接时就找不到了[/quote]
可是我其他的.h和.cpp都無這錯誤, 偏偏這個報錯
ipqtjmqj 2016-12-27
  • 打赏
  • 举报
回复
引用 3 楼 a784063999 的回复:
[quote=引用 2 楼 shiyanbo_1006 的回复:] 就是库的设置问题
引用 1 楼 ipqtjmqj 的回复:
要设置链接库设置了吗
同Project的, 不用設置這個吧[/quote] 直接源代码才叫同Project, 你有编译loadVulkan.cpp, 光include头文件只是骗过编译器而已, 链接时就找不到了
a784063999 2016-12-27
  • 打赏
  • 举报
回复
引用 2 楼 shiyanbo_1006 的回复:
就是库的设置问题
引用 1 楼 ipqtjmqj 的回复:
要设置链接库设置了吗
同Project的, 不用設置這個吧
待续_1006 2016-12-27
  • 打赏
  • 举报
回复
就是库的设置问题
ipqtjmqj 2016-12-27
  • 打赏
  • 举报
回复
要设置链接库设置了吗

65,189

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧