The concept of headers in C was necessary at its time, but these days it just makes compilation of complex program in complex environment several times more complex. Whenever you have several package-roots (I have /usr, /usr/local, /sw, /opt/local, /opt/some_pkg1, /opt/some_pkg2 at the same time), which have different versions of the same libraries, you need to separately check resolution order of libraries and header-files.
Sometimes it feels completely counter-intuitive and you just end up manually hiding some files.
Common end-user solution is just sticking to the package-root provided by distribution (usually “/usr”), but that is not an option for developer, who needs to test different combinations of bleeding-edge apps.
How do you manage this stuff?
Example. I need to build php6 (installation prefix /opt/php6) with:
iconv from /sw (whle there is other iconv in /usr)
libxml from /usr (while there is other libxml in /sw)
icu from /sw/local (while there are pieces of other icu’s in /sw and /usr)
In reality, there are more libs involved, and complexity arises, when these different libs are needed by the same components of php. I start thinking, that I should create some special package-root and just symlink every needed library in it. And just give it as the only package-root to php. Seems like a complex task, while considering all dependencies.
In my ideal world, there would be no name-resolution at all, compiler would just require exact position of library (which would be represented by the single file)