How to Solve MinGW _ZNSt18condition_variable10notify_oneEv Error on Windows 10

When I was trying to run a barcode reader app compiled by MinGW GCC on Windows 10, I got an error message “The procedure entry point _ZNSt18condition_variable10notify_oneEv could not be located in the dynamic link library”. In this article, I will share my experience of how to solve the issue on Windows 10.

A Barcode Reader App Built with MinGW GCC

After setting up my MinGW environment, I wondered whether it is possible to link MSVC DLLs straightforward. The answer from StackOverflow is NO. MSVC cannot use the MinGW library and vice versa.

Because Dynamsoft R&D team has internally built a libDynamsoftBarcodeReader.dll file and a libDynamsoftBarcodeReader.dll.a file using MinGW GCC, I can use the libraries to build my app with MinGW GCC:

gcc -o demo ReadBarcode.cpp -L . -lDynamsoftBarcodeReader -lstdc++

Unfortunately, the app failed to run in my environment:

MinGW _ZNSt18condition_variable10notify_oneEv could not be located in the dynamic link library

I Googled the error message and found it is related to libstdc++. How can I tackle the issue?

The Process of Finding the Answer

First, I need a tool to view the Windows DLL dependencies and relevant function symbols. There is a powerful tool “dumpbin” located in Visual Studio. If we type in dumpbin in cmd.exe, it cannot be recognized. A simple way is to run the tool in the Visual Studio command-line tool.

dumpbin /dependents D:\dbr-linux-7.4\Dynamsoft\BarcodeReader\samples\c++\ReadBarcode\demo.exe

dumpbin dependency

The dependent libstdc++-6.dll could be found under the MinGW directory. The next step is to export function symbols from libstdc++-6.dll:

dumpbin /exports C:\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin\libstdc++-6.dll

dumpbin export

I saved dumps to a text file and found the so-called missing function _ZNSt18condition_variable10notify_oneEv.

_ZNSt18condition_variable10notify_oneEv

Since the function symbol is out there, probably another libstdc++ lib which does not contain the function was loaded when running my app.

The library finding paths are stored in System Properties > Advanced > Environment Variables > System Variables > Paths.

Windows system library paths

By using a binary search, I locked QEMU which is above the MinGW path.

QEMU libstdc++

I exported the symbols of the QEMU libstdc++-6.dll and found there is no _ZNSt18condition_variable10notify_oneEv inside.

QEMU MinGW libstdc++

I made a simple test: remove the libstdc++ file from the QEMU directory and run my app again. The app built with MinGW GCC finally worked.

MinGW barcode