The attached diff fixes this issue for me. Appending $Config{_exe} is unnecessary on cygwin, since -x works with or without the extension if it is present, but only without it if testing a symlink. An alternate fix would be to check both with and without appending $Config{_exe}.
observe:
fs01% ls -l /bin/cpp*
-rwxr-xr-x 1 ollisg None 694301 Dec 6 07:51 /bin/cpp.exe*
fs01% perl -E 'say "yes" if -x "/usr/bin/cpp.exe"'
yes
fs01% perl -E 'say "yes" if -x "/usr/bin/cpp"'
yes
diff --git a/lib/Devel/CheckLib.pm b/lib/Devel/CheckLib.pm
index f80ca22..8581039 100644
--- a/lib/Devel/CheckLib.pm
+++ b/lib/Devel/CheckLib.pm
@@ -374,7 +374,7 @@ sub _findcc {
my @cc = split(/\s+/, $Config{cc});
return ( [ @cc, @ccflags ], \@ldflags ) if -x $cc[0];
foreach my $path (@paths) {
- my $compiler = File::Spec->catfile($path, $cc[0]) . $Config{_exe};
+ my $compiler = File::Spec->catfile($path, $cc[0]) . ($^O eq 'cygwin' ? '' : $Config{_exe});
return ([ $compiler, @cc[1 .. $#cc], @ccflags ], \@ldflags)
if -x $compiler;
}