The situation here is that you run a server and when trying to install a PHP module via PECL you receive the “checking whether the C compiler works… configure: error: cannot run C compiled programs.” error followed by the build failing.
The problem is that PECL is trying to write and run the files its trying to build in your /tmp directory, but your /tmp directory is mounted with “noexec” so the files can not be executed. What you will see will look something like this:
Note: I’m building APC on a cPanel CentOS server.
$ pecl install apc downloading APC-3.0.19.tgz ... Starting to download APC-3.0.19.tgz (115,735 bytes) .........done: 115,735 bytes 47 source files, building running: phpize Configuring for: PHP Api Version: 20090626 Zend Module Api No: 20090626 Zend Extension Api No: 220090626 Use apxs to set compile flags (if using APC with Apache)? [yes] : yes building in /var/tmp/pear-build-root/APC-3.0.19 running: /root/tmp/pear/APC/configure --with-apxs checking for egrep... grep -E checking for a sed that does not truncate output... /bin/sed checking for cc... cc checking for C compiler default output file name... a.out checking whether the C compiler works... configure: error: cannot run C compiled programs. If you meant to cross compile, use `--host'. See `config.log' for more details. ERROR: `/root/tmp/pear/APC/configure --with-apxs' failed
One solution out there is to unmount then remount /tmp without ‘noexec’ when trying to build via pecl, but this method opens up a security hole in the server for the time you have it mounted without ‘noexec’. The next method is to build the module yourself using the typical “phpize”, “./configure” then “make install”. This method is better then the first but this one is just a workaround for the problem making you unable to use PECL and still makes you od much more work then you have to with PECL.
My solution to this seems to be the most simple, and easiest one of the bunch. All you have to do is create a symlink from where PECL wants to save and run the files to somewhere where it can run them, in this case /root/tmp, with the following command:
$ mkdir /root/tmp/pear-build-root && ln -s /root/tmp/pear-build-root /tmp/
After running that command (as root or other super user) retry installing your module via PECL and it should now work without issue.