首页 > 解决方案 > 为了避免尝试导出 VST3 时出现未解决的外部符号错误,我需要包括哪些内容?

问题描述

我目前正在尝试第一次编译 VST3 插件(或任何 C++ 代码),主要只是遵循Steinberg 自己的教程,除了实际的声音处理之外。尝试编译会引发“未解析的外部符号”错误:

Error   LNK2019 unresolved external symbol "public: __cdecl VSTGUI::VST3Editor::VST3Editor(class Steinberg::Vst::EditController *,char const *,char const *)" (??0VST3Editor@VSTGUI@@QEAA@PEAVEditController@Vst@Steinberg@@PEBD1@Z) referenced in function "public: virtual class Steinberg::IPlugView * __cdecl Itisdud::Split_TimesController::createView(char const *)" (?createView@Split_TimesController@Itisdud@@UEAAPEAVIPlugView@Steinberg@@PEBD@Z)    Split_Times D:\programme\VST3Dev\Split_times\Split_Times\build\split_timescontroller.obj    1   

导致这种情况的函数 createView 仍然是项目生成器创建时的默认值:

IPlugView* PLUGIN_API Split_TimesController::createView (FIDString name)
{
    // Here the Host wants to open your editor (if you have one)
    if (FIDStringsEqual (name, Vst::ViewType::kEditor))
    {
        // create your editor here and return a IPlugView ptr of it
        auto* view = new VSTGUI::VST3Editor (this, "view", "split_timeseditor.uidesc");
        return view;
    }
    return nullptr;
}

从 again 和 adelay 样本复制 createView 函数也不起作用。

由于项目生成器仅包含 vstgui4/vstgui/plugin-bindings/vst3editor.h 而不是 vst3editor.cpp 文件,因此我也尝试包含该文件(正如我所读到的,没有实际实现可能是导致问题),但是这并没有解决问题,而是在编译时发生了许多其他错误。

我也尝试遵循这一点,包括那里记录的 cpp 文件并将 createView 函数更改为那里写的内容,但这也只会导致编译时出现超过 300 个错误。

从另一个示例中复制包含也不起作用。

我需要包括什么才能使它起作用?

标签: c++includevst

解决方案


这些是链接器错误,因为您没有指示链接器在哪里可以找到您正在使用其功能的所需库文件。

请记住,编译是一个涉及编译和链接的两步过程,因此最好将它们分开。

假设您在 Windows 上使用 Visual Studio,并假设您的 VST SDK 安装在

C:\VST3SDK.

您应该做的第一件事是启动 Visual Studio 并选择 File->Open->CMake 并在此处找到 CMake.txt 文件

C:\VST3SDK\VST3_SDK.

加载此文件后,您将在 Visual Studio 解决方案资源管理器中找到已加载 VST SDK 的现成项目列表。

你会发现其中一个项目被称为图书馆,这是你必须做的第一个动作。

现在您必须根据您是要制作 32 位还是 64 位 VST 来构建正确的库,并且您应该相应地设置库项目的配置。

您将构建这些库,如果您没有更改任何设置,这些库将位于

C:\VST3SDK\VST3_SDK\out\build\x64-Debug\lib 

或者

C:\VST3SDK\VST3_SDK\out\build\x64-Release\lib

the necessary libraries being:

base.lib
pluginterfaces.lib
sdk.lib
sdk_common.lib
sdk_hosting.lib
vstgui.lib
vstgui_standalone.lib
vstgui.support.lib
vstgui_uidescription.lib

上述步骤可确保您现在拥有 VST 所依赖的必要库文件。

现在假设您有一个 VST 示例项目,假设您是从 Git-hub 获得的,并且它已正确编写和设置以在 Visual Studio 上运行,即它带有

myVST.vcxproj file.

然后您可以将以下编译指示粘贴到一个显眼的 VST 文件中,例如 factory.cpp

#pragma comment(lib, "base.lib")
#pragma comment(lib, "pluginterfaces.lib")
#pragma comment(lib, "sdk.lib")
#pragma comment(lib, "sdk_common.lib")
#pragma comment(lib, "sdk_hosting.lib")
#pragma comment(lib, "vstgui.lib")
#pragma comment(lib, "vstgui_standalone.lib")
#pragma comment(lib, "vstgui_support.lib")
#pragma comment(lib, 
"vstgui_uidescription.lib") 

(由于本网站的格式要求令人困惑,必须缩写,但将“vstgui.lib”替换为“C:/VST3SDK/VST3_SDK/out/build/x64-Debug/lib/vstgui.lib”等完全限定路径

现在,如果您的项目属性

C/C++ _> General _> Additional Include Directories 有正确的条目,会告诉编译器它将找到所有#include 文件的路径,然后你会发现,如果你右键单击任何可编译文件(c、cpp、rc . ..) 并选择编译,则文件应成功编译为目标文件,而不会出现任何编译器错误,否则表明编译器找不到所需的头文件。

但是您面临的问题是链接器问题,链接器找不到您在项目中使用过的所需函数库,解决方案只是粘贴上面的 pragma。


推荐阅读