从 (.exe) 中声明的 dll 调用 extern 函数 - 错误 LNK2019:无法解析的外部符号

问题描述 投票:0回答:1

这是我的第一个问题,大家好!

我遇到了 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。

c++ extern
1个回答
0
投票

与共享对象或静态库不同,DLL 必须在链接上获取其所有符号,因为它是封闭的编译单元。 您在 DLL 上留下了一个外部符号,而您在 DLL 链接时没有提供该符号,这导致了 DLL 链接失败。您确实提供了可执行文件中缺少的符号,但为时已晚。

© www.soinside.com 2019 - 2024. All rights reserved.