diff --git a/source/dub/compilers/compiler.d b/source/dub/compilers/compiler.d
index 3fbd91d..d1dff27 100644
--- a/source/dub/compilers/compiler.d
+++ b/source/dub/compilers/compiler.d
@@ -129,13 +129,11 @@
 			if (f.startsWith("-Wl,")) settings.addLFlags(f[4 .. $].split(","));
 			else settings.addLFlags(f);
 		}
+		settings.libs = null;
 	} catch (Exception e) {
 		logDiagnostic("pkg-config failed: %s", e.msg);
 		logDiagnostic("Falling back to direct -lxyz flags.");
-		version(Windows) settings.addSourceFiles(settings.libs.map!(l => l~".lib")().array());
-		else settings.addLFlags(settings.libs.map!(l => "-l"~l)().array());
 	}
-	settings.libs = null;
 }
 
 
@@ -409,7 +407,7 @@
 			else return settings.targetName;
 		case TargetType.library:
 		case TargetType.staticLibrary:
-			if( platform.platform.canFind("windows") )
+			if (platform.platform.canFind("windows") && platform.compiler == "dmd")
 				return settings.targetName ~ ".lib";
 			else return "lib" ~ settings.targetName ~ ".a";
 		case TargetType.dynamicLibrary:
diff --git a/source/dub/compilers/dmd.d b/source/dub/compilers/dmd.d
index 2ac08ab..686b8d5 100644
--- a/source/dub/compilers/dmd.d
+++ b/source/dub/compilers/dmd.d
@@ -84,8 +84,11 @@
 					settings.addDFlags(t[1]);
 		}
 
-		if (!(fields & BuildSetting.libs))
+		if (!(fields & BuildSetting.libs)) {
 			resolveLibs(settings);
+			version(Windows) settings.addSourceFiles(settings.libs.map!(l => l~".lib")().array());
+			else settings.addLFlags(settings.libs.map!(l => "-l"~l)().array());
+		}
 
 		if (!(fields & BuildSetting.versions)) {
 			settings.addDFlags(settings.versions.map!(s => "-version="~s)().array());
@@ -174,7 +177,7 @@
 		import std.string;
 		auto tpath = Path(settings.targetPath) ~ getTargetFileName(settings, platform);
 		auto args = [platform.compiler, "-of"~tpath.toNativeString()] ~ objects ~ settings.lflags.map!(l => "-L"~l)().array() ~ settings.sourceFiles;
-		static linkerargs = ["-g", "-gc", "-m32", "-m64"];
+		static linkerargs = ["-g", "-gc", "-m32", "-m64", "-shared"];
 		args ~= settings.dflags.filter!(f => linkerargs.canFind(f))().array();
 		logDiagnostic("%s", args.join(" "));
 		auto res = spawnProcess(args).wait();
diff --git a/source/dub/compilers/gdc.d b/source/dub/compilers/gdc.d
index ce7c8c5..68b6d15 100644
--- a/source/dub/compilers/gdc.d
+++ b/source/dub/compilers/gdc.d
@@ -73,8 +73,10 @@
 					settings.addDFlags(t[1]);
 		}
 
-		if (!(fields & BuildSetting.libs))
+		if (!(fields & BuildSetting.libs)) {
 			resolveLibs(settings);
+			settings.addDFlags(settings.libs.map!(l => "-l"~l)().array());
+		}
 
 		if (!(fields & BuildSetting.versions)) {
 			settings.addDFlags(settings.versions.map!(s => "-fversion="~s)().array());
diff --git a/source/dub/compilers/ldc.d b/source/dub/compilers/ldc.d
index 3a47b99..c5a7c14 100644
--- a/source/dub/compilers/ldc.d
+++ b/source/dub/compilers/ldc.d
@@ -76,8 +76,10 @@
 		// since LDC always outputs multiple object files, avoid conflicts by default
 		settings.addDFlags("-oq", "-od=.dub/obj");
 	
-		if (!(fields & BuildSetting.libs))
+		if (!(fields & BuildSetting.libs)) {
 			resolveLibs(settings);
+			settings.addLFlags(settings.libs.map!(l => "-l"~l)().array());
+		}
 
 		if (!(fields & BuildSetting.versions)) {
 			settings.addDFlags(settings.versions.map!(s => "-d-version="~s)().array());