这是我的第一个问题,大家好!
我遇到了 extern 函数“extern void TestExtern();”的问题它在我的共享库 (.dll) 的 .h 文件中定义为 extern,并从 cpp 调用。该函数在我的应用程序 (.exe) 项目的 cpp 文件中声明(实现)。
这是核心显示进度设置为 /VERBOSE 的输出
1>Microsoft (R) Windows (R) Resource Compiler Version 10.0.10011.16384
1>
1>Copyright (C) Microsoft Corporation. All rights reserved.
1>
1>
1>Creating C:\Users\danij\AppData\Local\Temp\lnk{13F88671-C637-469A-93A9-78E4106F389E}.tmp
1>
1>Using codepage 1252 as default
1>
1>C:\Users\danij\AppData\Local\Temp\lnk{2B156ACF-B9B2-4480-81AD-3C450DB4EB02}.tmp.
1>Writing 24:2, lang:0x409, size 381
1>Invoking cvtres.exe:
1> /machine:amd64
1> /verbose
1> /out:"C:\Users\danij\AppData\Local\Temp\lnk{97C07E2B-0967-433E-A12F-000334BDC2DB}.tmp"
1> /readonly
1> "C:\Users\danij\AppData\Local\Temp\lnk{13F88671-C637-469A-93A9-78E4106F389E}.tmp"
1>Microsoft (R) Windows Resource To Object Converter Version 14.39.33523.0
1>Copyright (C) Microsoft Corporation. All rights reserved.
1>
1>adding resource. type:MANIFEST, name:2, language:0x0409, flags:0x30, size:381
1>Core.obj : error LNK2019: unresolved external symbol "void __cdecl TestExtern(void)" (?TestExtern@@YAXXZ) referenced in function "int __cdecl TestingRestructure(void)" (?TestingRestructure@@YAHXZ)
1>Unused libraries:
1> Vendor\SDL3_Image\lib\x86_64\SDL3_Image.lib
1> Vendor\SDL3_Mixer\lib\x86_64\SDL3_Mixer.lib
1> Vendor\SDL3_TTF\lib\x86_64\SDL3_TTF.lib
1> C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\gdi32.lib
1> C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\winspool.lib
1> C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\comdlg32.lib
1> C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\advapi32.lib
1> C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\shell32.lib
1> C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\ole32.lib
1> C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\oleaut32.lib
1> C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\uuid.lib
1> C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\odbc32.lib
1> C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\odbccp32.lib
1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.39.33519\lib\x64\OLDNAMES.lib
1>..\Binaries\windows-x86_64\Debug\Core\Core.dll : fatal error LNK1120: 1 unresolved externals
1>Done building project "Core.vcxproj" -- FAILED.
2>------ Build started: Project: AppTest, Configuration: Debug x64 ------
2>AppTest.cpp
2>AppTest.vcxproj -> D:\GithubProjects\janjitest\janji\Binaries\windows-x86_64\Debug\AppTest\AppTest.exe
========== Build: 1 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
========== Build completed at 12:55 PM and took 00.816 seconds ==========
这是我的解决方案结构:
Solution:
Core:
Core.h
Core.cpp
AppTest:
AppTest.h
AppTest.cpp
核心.h
#pragma once
#include "Defines.h"
COREAPI int TestingRestructure();
extern void TestExtern();
核心.cpp
#include "Core.h"
#include "Defines.h"
int TestingRestructure()
{
TestExtern();
return 0;
}
AppTest.h
#pragma once
应用测试.cpp
#include "AppTest.h"
#include <Core/Core.h>
int main(void)
{
return TestingRestructure();
}
void TestExtern()
{
}
我的想法是我想从dll中调用在exe中实现的函数。 我在这里做错了什么?
感谢您的宝贵时间,
丹尼尔。
我尝试调用 dll 的 .h 文件中定义的 extern 函数并从 cpp 调用它,但在 exe cpp 文件内部实现它。我得到的是错误 LNK2019: 无法解析的外部符号,并期望该函数正确链接,因为它定义为 extern。
与共享对象或静态库不同,DLL 必须在链接上获取其所有符号,因为它是封闭的编译单元。 您在 DLL 上留下了一个外部符号,而您在 DLL 链接时没有提供该符号,这导致了 DLL 链接失败。您确实提供了可执行文件中缺少的符号,但为时已晚。