I am using Windows 10 with mingw-w64. I tried compiling a program with a statically linked library. I used this command: g++ main.cpp -Llibs/ -lfoo
. But MinGW says it can't find the library files, so I tried renaming foo.a
to foo.lib
and voila, the compiler found foo.lib
. Why doesn't MinGW see *.a
files anymore?
2 Answers
From the documentation:
when ld is called with the argument ‘-lxxx’ it will attempt to find, in the first directory of its search path,
- libxxx.dll.a
- xxx.dll.a
- libxxx.a
- xxx.lib
- libxxx.lib
- cygxxx.dll
- libxxx.dll
- xxx.dll
Alternatively, you can pass libs/foo.a
directly as an argument to g++
.
The problem is that mingw will not look for <libname>.a
files because it does not expect them to exist.
From the docs:
MinGW supports libraries named according to the ".lib" and ".dll" conventions, in addition to the normal "lib.a" convention common on *nix systems
This is because windows does not use the lib
prefix for its libraries in the same way that *nix does (on windows a shared library foo would be foo.dll
and on *nix it would be libfoo.so
). I am not sure how you managed to get a .a
missing the lib
prefix (unless you renamed it) but your .a
files should have a lib
prefix in them (when specifying this you omit the lib
part so libfoo.a
becomes -lfoo
)

- 1,939
- 10
- 19