X-Authentication-Warning: delorie.com: mail set sender to djgpp-bounces using -f X-Recipient: djgpp AT delorie DOT com Message-ID: <52B57658.2070801@gmx.de> Date: Sat, 21 Dec 2013 12:07:04 +0100 From: Juan Manuel Guerrero User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.2.0 MIME-Version: 1.0 To: djgpp AT delorie DOT com Subject: A question about gcc's LIBRARY_PATH and /dev/env/DJDIR Content-Type: text/plain; charset=ISO-8859-15; format=flowed Content-Transfer-Encoding: 7bit X-Provags-ID: V03:K0:MEzHquCfddYFPcJH1psmO1DNM+R1O2aHmn8flR5Q4dv9YRnQ8T9 o6L98srxNcdPzz+A3vTF76h/JkLGXrDhM09L74jDlmMhwM9prhPH1EUKDqTJO+QeRbxMi+R KfnRruwMx2Z71IpIpu7vN93EiLNDYJ0Ietfxlcmkladj02CnDtc0EyUG/F7N4bpEIf0xlob hep2ijAI+UmKxrsvCLqxA== Reply-To: djgpp AT delorie DOT com Please inspect to following code snippet: #include int main(void) { return 0; } I have tried to compile this using gcc482. The code shall be linked with libwatt.a using the following command: gcc -v a.c -lwatt The code snippet is stored in the H:\l\_libxml2-2.9.1\_ directory (see later). The watt-32 port is installed at its canonical place in the DJGPP installation tree. This is: /dev/env/DJDIR/net In this directory all required watt-32 specific directories are created. These are: /dev/env/DJDIR/net/watt/inc for headers. /dev/env/DJDIR/net/watt/lib for libraries. Due to the fact that this port (intentionaly) does not install its headers and its library in the DJGPP specific canonical places: /dev/env/DJDIR/include for headers. /dev/env/DJDIR/lib for libraries. it is very important that the C_INCLUDE_PATH and LIBRARY_PATH environment variables point to the watt-32 specific directories. In my installation this is: set C_INCLUDE_PATH=/dev/env/DJDIR/net/watt/inc set LIBRARY_PATH=/dev/env/DJDIR/net/watt/lib Although the environment variables are set the linker fails to find the library. To show what happens, I have compiled with gcc's -v option: Using built-in specs. COLLECT_GCC=C:\DJGPP-2.04\BIN/gcc.exe COLLECT_LTO_WRAPPER=c:/djgpp-2.04/bin/../libexec/gcc/djgpp/4.82/lto-wrapper.exe Target: djgpp Configured with: /gnu/gcc-4.82/configure djgpp --disable-werror --enable-languages=c,c++,fortran,objc,obj-c++,ada --enable-libquadmath-support --disable-lto Thread model: single gcc version 4.8.2 (GCC) COLLECT_GCC_OPTIONS='-v' '-mtune=pentium' '-march=pentium' c:/djgpp-2.04/bin/../libexec/gcc/djgpp/4.82/cc1.exe -quiet -v -iprefix c:/djgpp-2.04/bin/../lib/gcc/djgpp/4.82/ -remap a.c -quiet -dumpbase a.c -mtune=pentium -march=pentium -auxbase a -version -o ./ccVihO4Q.s GNU C (GCC) version 4.8.2 (djgpp) compiled by GNU C version 4.8.2, GMP version 5.1.2, MPFR version 3.1.2, MPC version 1.0.1 GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096 ignoring nonexistent directory "c:/djgpp-2.04/bin/../lib/gcc/djgpp/4.82/../../../../djgpp/include" ignoring duplicate directory "c:/djgpp-2.04/lib/gcc/../../lib/gcc/djgpp/4.82/include" ignoring duplicate directory "c:/djgpp-2.04/lib/gcc/../../lib/gcc/djgpp/4.82/include-fixed" ignoring nonexistent directory "c:/djgpp-2.04/lib/gcc/../../lib/gcc/djgpp/4.82/../../../../djgpp/include" #include "..." search starts here: #include <...> search starts here: /dev/env/DJDIR/net/watt/inc c:/djgpp-2.04/bin/../lib/gcc/djgpp/4.82/include c:/djgpp-2.04/bin/../lib/gcc/djgpp/4.82/include-fixed c:/djgpp-2.04/include End of search list. GNU C (GCC) version 4.8.2 (djgpp) compiled by GNU C version 4.8.2, GMP version 5.1.2, MPFR version 3.1.2, MPC version 1.0.1 GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096 Compiler executable checksum: b64da8eb31f17f53c5a790655392b614 COLLECT_GCC_OPTIONS='-v' '-mtune=pentium' '-march=pentium' c:/djgpp-2.04/bin/as.exe -v -o ./ccDoJFsU.o ./ccVihO4Q.s GNU assembler version 2.24 (djgpp) using BFD version (GNU Binutils) 2.24 COMPILER_PATH=c:/djgpp-2.04/bin/../libexec/gcc/djgpp/4.82/;c:/djgpp-2.04/bin/../libexec/gcc/;c:/djgpp-2.04/bin/ LIBRARY_PATH=c:/djgpp-2.04/bin/../lib/gcc/djgpp/4.82/;c:/djgpp-2.04/bin/../lib/gcc/;c:/djgpp-2.04/lib/;c:/djgpp-2.04/lib/;c:/djgpp-2.04/bin/../lib/gcc/djgpp/4.82/../../../ COLLECT_GCC_OPTIONS='-v' '-mtune=pentium' '-march=pentium' c:/djgpp-2.04/bin/../libexec/gcc/djgpp/4.82/collect2.exe c:/djgpp-2.04/lib/crt0.o -Lc:/djgpp-2.04/bin/../lib/gcc/djgpp/4.82 -Lc:/djgpp-2.04/bin/../lib/gcc -Lc:/djgpp-2.04/lib -Lc:/djgpp-2.04/lib -Lc:/djgpp-2.04/bin/../lib/gcc/djgpp/4.82/../../.. ./ccDoJFsU.o -lwatt -lgcc -lc -lgcc c:/djgpp-2.04/bin/ld.exe: cannot find -lwatt collect2.exe: error: ld returned 1 exit status As can be seen the C_INCLUDE_PATH environment variable is honored but the LIBRARY_PATH is not honored at all. Please inspected gcc's output for the -print-search-dirs option: install: c:/djgpp-2.04/bin/../lib/gcc/djgpp/4.82/ programs: =c:/djgpp-2.04/bin/../libexec/gcc/djgpp/4.82/;c:/djgpp-2.04/bin/../libexec/gcc/;c:/djgpp-2.04/bin/../lib/gcc/djgpp/4.82/../../../../djgpp/bin/djgpp/4.82/;c:/djgpp-2.04/bin/../lib/gcc/djgpp/4.82/../../../../djgpp/bin/;c:/djgpp-2.04/bin/djgpp/4.82/;c:/djgpp-2.04/bin/ libraries: =c:/djgpp-2.04/bin/../lib/gcc/djgpp/4.82/;c:/djgpp-2.04/bin/../lib/gcc/;h:/net/watt/lib/djgpp/4.82/;h:/net/watt/lib/;c:/djgpp-2.04/lib/djgpp/4.82/;c:/djgpp-2.04/lib/;c:/djgpp-2.04/bin/../lib/gcc/djgpp/4.82/../../../../djgpp/lib/djgpp/4.82/;c:/djgpp-2.04/bin/../lib/gcc/djgpp/4.82/../../../../djgpp/lib/;c:/djgpp-2.04/lib/djgpp/4.82/;c:/djgpp-2.04/lib/;c:/djgpp-2.04/bin/../lib/gcc/djgpp/4.82/../../../djgpp/4.82/;c:/djgpp-2.04/bin/../lib/gcc/djgpp/4.82/../../../ The thing that really confuses me are the following two library entries: h:/net/watt/lib/djgpp/4.82/ h:/net/watt/lib/ The H: partition is the current working partition. Instead of searching for the library at /dev/env/DJDIR/net/watt/lib (aka c:/djgpp-2.04/net/watt/lib) gcc seems to replace the /dev/env/DJDIR prefix by the current drive letter. Please note that the drive letter used to create the library path changes if I change the partition. It seems to be that the path is always constructed by replacing the /dev/env/DJDIR value by the current drive letter. Is there any reason why /dev/env/DJDIR seems to work for the include path but fails for the library path? Just for fun I tried a lot of other gcc versions but they all fail to find the library. Of course, if I replace /dev/env/DJDIR by c:/djgpp-2.04 in the LIBRARY_PATH environment variable the compiler works flawlessly. IMHO two questions arise: - why does the /dev/env/DJDIR prefix work for C_INCLUDE_PATH and fails for LIBRARY_PATH ? - why does gcc replace /dev/env/DJDIR by the current drive letter when creating the library paths? I have read the gcc info doc and it tells that LIBRARY_PATH is a colon separated list of directories to search for linker files if they cannot be found using GCC_EXEC_PREFIX. I have assumed that these directories are absolute paths and not relative paths to the current partition or am I missing something? Please note that all this is not an inconvenience to me but it is confusing to have to remember which environment variable honors /dev/env/DJDIR and which one does not. Can /dev/env/DJDIR be used in an environment variable or not? If more information is needed please contact me. Regards, Juan M. Guerrero