Help Getting VST3 to work with Linux (Ubuntu 20.04)

Hello, I am new to Linux and had previously used Juce with windows with no issues. I am trying to build the “basic” audio plugin as a vst3 so that I can make sure it works in a DAW before I go any further.

Following some advice I saw on another thread I downloaded the current 6.05 development branch (zip) which apparently fixes some codeblocks IDE issues and built the Projucer makefile via “make”.

This generated a shared library which I was not expecting, however it will run via ./“Projucer” in the terminal

I have selected VST3 in the plugin format settings.

I am confused about whether the steinberg SDK’s will even work in Linux but have tried to add them to the global paths anyway…however there are no options for VST3 SDK in the global paths! As you can see below.

When I was on Windows it was always there. Whether or not I add the VST3 path to legacy or leave it blank, I get the same codeblocks error shown here, IE: it seems to think I have not selected a plugin format, which I definately have. There are no warnings regarding no VST3 SDK paths etc. Just this.

I am new to Linux and trying to work out what may be wrong but have run out of ideas. I would realy appreciate some help so that I can get on with making plugins and not spend all my time just trying to get up and running.

If you spot anything ive done wrong or can give me some (baby) steps on how to get the “basic” audio plugin built as a vst3 via (hopefully) codeblocks or other method it would be greatly appreciated.

Thank you.

Have you tried with a makefile instead of code blocks? Here it just works, no need to set vst3 sdk I guess it’s built in

I tried and yes! that actually worked. So going forward, how do you write plugins? I had always used visual studio in the past and assumed I would repeat the process via codeblocks in Linux but if my plugins will not be built via codeblocks what shall I do? Are you using another IDE?

At first I wrote in atom, with a debug plugin. And a plugin to make with right click. Now I use Visual Studio Code cause it has intellisense and it is handy to have.

For the record, you didn’t do anything wrong. Building VST3 plugins with Code::Blocks is currently not supported by JUCE, neither on Linux nor Windows. See CodeBlocksProjectExporter::supportsTargetType:

oh wow ok. Thats strange that they include the option on the projucer GUI. ill look at visual studio code then. So that is used in the same manner VS in windows is? IE I save projucer template as a visual studio sln then open it with VS code, write the plugin and build from there?

No, it’s a very different editor. You’ll need to install some extensions (CPP, CMake tools) and create CMakeLists.txt to configure your builds. There are examples on how to do that in the Juce repository (documentation here and examples here).

@eyalamir did a boilerplate repository for CMake projects that you can find here, it’s a good starting point and I think it will work on Linux.

I didn’t try building on Linux yet but I’m curious about your results, and I wish more software editors would build a Linux version of their plugins…

1 Like

Thanks. ill have at look at the links and hopefully work them out. if I get a basic plugin working ill let you know.

OK so im (very) slowly working out how to use CMake to get things running. There are a couple of questions I have that would help me out a lot if anyone can help here.

Im playing with the basic “hello world” audio plugin example and I can get it running in Reaper DAW with changes to text if I want, so its building with basic changes so far.

The output “vst3” actually has a “.so” extension NOT .vst3. Is this normal for Linux or something?

When I “make” the plugin it appears in a directory in my CMake build folder called “AudioPluginExample_artefacts” which is automatically created (not by me)

Juce_stuff/PROJECTS/CMake example/builds/AudioPluginExample_artefacts/VST3/Audio Plugin Example.vst3/Contents/x86_64-linux/here

which is a bit annoying because I would rather it built into a set folder…so looking at the CMakeLists.txt there is the following option…

which looks good to me, but how do I tell it where this “default location” is???

and lastly…

The only way I could get CMake to work was to copy the whole “JUCE” folder into the project root folder such that this option worked:

but this is obviously annoying as I will have to paste it in for every project. The greyed out option does not work. I tried to install Juce on the system via:

sudo apt-get install -y juce-tools

but using the JUCE CONFIG REQUIRED option gives me the following errors:

Any help here would be greatly appreciated. Rest assured I am trying to study CMake and the terminal etc but any pointers in the right direction would be invaluable.



  1. the .vst3 extension is on the folder (for instance, Audio Plugin Example.vst3), but then a VST3 plugin is just a loadable binary, so it has the expected extension, depending on the platform: .so on Linux, .dylib on macOS, and .dll on Windows.

  2. if you read the documentation for COPY_PLUGIN_AFTER_BUILD in docs/CMake, you’ll see that it is followed by the documentation for VST3_COPY_DIR.

  3. docs/CMake and the examples in examples/CMake/* use add_subdirectory(JUCE) because it is the simplest form. But you can use something like

    add_subdirectory("../../third-party/JUCE" "JUCE")

    if your copy of JUCE is not a subdirectory of your project folder.

    juce-tools is not maintained by the JUCE team and is not the official way to get JUCE, even on Ubuntu. Please do not install this package.

    If you want to install JUCE on your system and use find_package, you can follow the instructions given in docs/CMake

I hope this helps!

1 Like

Maybe you want to watch this video

Eyal Amir explains his repository very well.


Thanks for your responses guys. I realy appreciate it.

I have removed juce-tools and will spend time this week on the links and video

all the best

Ok so ive ran into another issue…

I think I have managed to install Juce on my system correctly and when I run “make” the plugin compiles without warnings.

However - When I am editing my PluginEditor.cpp file, my syntax checker persists with the following:

The header is on my system in my:


and will also be present if I copy a whole JUCE folder into the project root and use add_subdirectory(JUCE) in the CMakeLists.txt

but I cannot get this warning to go away.

I have not made an actual audio plugin yet as im (still!) struggling with all these things but I would assume that while “hello world” will run fine as some DAW text, this seems to indicate that something will fail further down the line.

Apart from this, the warning would annoy the hell out of me if its a false warning

Any ideas on what is happening here?

I am using the template CMakeLists.txt from the AudioPluginExample and have not changed any of the example files yet.

Is it something to do with linking the project files to the juce headers in some other way not included in the example tutorial?


Have you tried the template of Eyal Amirs github repository? This template clones the juce repository into the build folder by running cmake. You don’t need to install juce in an other place by doing this.

No I havnt. I dont want to have to install juce every time I make a new project. I will have a look at it if nothing else works. I already have it installed on the system so it is annoying me that it doesnt work

How is your syntax checker configured?
Did you tell it that /JUCE/install/include/JUCE-6.0.5/modules/ is an include directory? Or is it getting that information from CMake?

Thanks. Yes I didnt specify the full path to “modules”. I think that was the issue. I thought it would search down from “install”

The previous error is gone now but now I’m getting the following:

I have read a couple of forum posts with a similar issue but these do not use the example audio plugin and I assumed that the settings they changed would not be necessary for this case.

Any idea what might be going on here? Thanks again

Again, how is your syntax checker configured?
Did you specify it all the preprocessor definitions that are necessary to build your project?

Ah ok. So the checker im using is called Syntastic and the way I tell it where to look for definitions is a file called .syntastic_cpp_config which only contains one line:


this is in my directory which contains all my Juce project directories. The syntax checker seems to be reading this correctly as you can see from the yellow highlighted path in the previous post.

As for “preprocessor definitions” im not sure what you mean here to be honest.

Ive looked at the “no global header file was included” warning in TargetPlatform.h and read its comment but im struggling to understand it. I am assuming that it refers to the abscence of a “juceHeader.h” file in my project which I remember used to be included in my old projects. However I have been reading here that it is no longer required and it has been advised not to use one for modern projects.

the comment states “you can just define JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED globally to avoid this error”
but im not sure if this is the correct thing to do and im not sure in which file do do this.

Im working on the assumption that the cmake examples from the github are ready to go so have just been focusing on trying to remedy these errors in the checker. I have been assuming that the builds are probably fine and it is just the checker that is confused

sorry, I realize my knowledge is not advanced!

I didn’t have a close look at Syntastic, but, based on the errors it gives you, I guess that it at least needs to preprocess the source files. “Preprocessing” means resolving the “preprocessor directives”: #include, #if, #else, #elif, #endif, #define, #undef, #error, #pragma, etc. (see Preprocessor - for a more formal/complete definition). It is one of the many steps that a C++ compiler performs.

The first error you got was fatal error: juce_audio_processors/juce_audio_processors.h: No such file or directory, which came from the preprocessor directive #include <juce_audio_processors/juce_audio_processors.h>. You solved this by giving to Syntastic the same flag that you would pass to the C++ compiler.

Now, the error you are getting comes from preprocessing juce_TargetPlatform.h, which needs either JUCE_APP_CONFIG_HEADER or JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED to be defined. As you noted, the comment in juce_TargetPlatform.h explains that this is related to the AppConfig.h header (not JuceHeader.h) which is nowadays deprecated, especially when using the CMake support of JUCE 6. Indeed, when building a JUCE 6 project with CMake, -DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1 is passed to the compiler.

Here, -DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1 is a “preprocessor definition”, it tells the preprocessor that a symbol named JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED is defined with the value 1. It is equivalent to writing


directly in the source code. If you add that processor definition to the Syntastic configuration, it should solve that error. However, you might still get errors, because there are dozens of preprocessor definitions passed to the compiler to build a JUCE project.

I hope this helps!