Hello, a few moments ago, I tried to compile lynx. It complained about the lack of ncurses. I downloaded it, compiled it and then installed it to non standard directory.
Going back to the lynx, I expected to pass ncurses location to it through a .pc file and PKG_CONFIG_PATH. However the version of ncurses that I installed does not have . pc file.
Then I passed the location of ncurses "lib" dir to LD_LIBRARY_PATH and exported it. It did not work, lynx configure was not able to find it. Then I decided to use LDFLAGS=-L'..../ncurses/lib/'. And it did work! The question is.......why?
'
What LDFLAGS does that LD_LIBRARY_PATH does not? Thanks for your time
Then I passed the location of ncurses "lib" dir to LD_LIBRARY_PATH and exported it. It did not work, lynx configure was not able to find it. Then I decided to use LDFLAGS=-L'..../ncurses/lib/'. And it did work! The question is.......why? What LDFLAGS does that LD_LIBRARY_PATH does not? Thanks for your time
Obviously the environment variables LDFLAGS and LD_LIBRARY_PATH serve similar but different purposes. The way you used them both tell some (part of the) system to look in a certain list of directories to find something the respective part of the system looks for. So far, they are similar and hence work similarly. But the parts of the system they address are different and this is why the one "worked" and the other "didn't" - both actually worked, but you needed the part of the system addressed by the one and therefore the other had no effect.
LD_LIBRARY_PATH tells the runtime environment where to look for (dynamically linked) libraries. When you compile a (C) program it will consist of a main() function and many other functions. Each of these are first compiled into "object code". This is what the compiler does. Then these objects are picked up by the linker (more precisely "linkage editor") and are bound together to the final executable. This can be done by either putting all the objects together statically ("static linking") which will make the executable independent of external libraries but will make the functions available only within the executable. The executable can also be linked "dynamically" which means that some functions may still be included within the executable but some may be put into a separate library instead or they may even be provided from such a library so that there is no source code (and no object code) within the programs source to begin with. The advantage is that you can (re-)use already available functions without having to write them and other programs can use these functions too but it also makes the executable dependent on the availability of these external libraries from which the functions are being loaded at runtime.
Where these libraries exactly are (typically /usr/lib, /usr/local/lib, etc.) will be determined by the environment variable LD_LIBRARY_PATH (the Linux variant, the "LD" actually stands for "dynamic loader") or LIBPATH (the UNIX variant) and from a practical POV it is sensible to set both variables and set them to the same value. If either one is required it will work.
After this, now for the LDFLAGS variable: the LDFLAGS variable is used by the cmake utility to set the flags for the linker. So, basically what you did by:
was to tell cmake that whenever the linker was called during the make process it should add -L'..../ncurses/lib/' to the commandline in addition to all the things already placed there by various other means. The role of LDFLAGS in this regard is similar to that of CFLAGS which sets additional flags for every call of the compiler. Note that both LDFLAGS as well as CFLAGS can put any other flag onto the commandline of their respective utility, not just the location of libraries.
I suggest to read the man pages of make (i.e. the cmake variant), the C-compiler of your choice (probably gcc, but then there are others too), the linkage editor you use, etc., for a list of available flags.
Also notice that there are similar variables (also called "macros") for other tools:
I hope this helps.
bakunin
These 4 Users Gave Thanks to bakunin For This Post:
Another doubt. Once during a compilation, I passed the location of the Glib .pc file to the program I was compiling through PKG_CONFIG_PATH, however, configure complained about the existence of another version of Glib, that already was installed in my system. However, when I adjusted LD_LIBRARY_PATH to the lib dir of my compiled Glib, it ignored the system default Glib, allowing the configuration process to execute until its end. If LD_LIBRARY_PATH is to be used during runtime, how it did work in this case? Shouldn't have been LDFLAGS ?
configure complained about the existence of another version of Glib, that already was installed in my system. However, when I adjusted LD_LIBRARY_PATH
Yes, LD_LIBRARY_PATH is for runtime, but when you runconfigure this is its runtime. Therefore it noticed that you are compiling against one glibc but woud have been running (once you would have tried to run the compiled program) against another glibc. This was why it complained. Most probably this was not an error but a warning, right?
Once you changed your runtime environment configure saw that your compile-time environment and your runtime-environment would be the same and found nothing to complain about any more.
I am on Solaris .
I have written a script callled T_1.sh
#!/bin/sh
########################################################################################################
# # Source borne shell env.This is required for crontab to work as bip.sh uses environmental variables.... (24 Replies)
Hi.,
Currently my LD_LIBRARY_PATH setting is,
LD_LIBRARY_PATH=/opt/app/product/11.2.0/client_1/lib
Now, I need to append the JAVA to this setting...
Can I set this way, Please suggest.
... (4 Replies)
I have a question on setting environmental variable LD_LIBRARY_PATH.
The case is that, i cannot execute wget on my AIX machine.
It return the following error:
exec(): 0509-036 Cannot load program wget because of the following errors:
0509-022 Cannot load module... (5 Replies)
Inside my csh script, I have the following command:
source ${HOME}/.login
When I execute my csh script, why do I get the following error message:
/cygdrive/c/WINDOWS/system32/export: Permission denied
This is what I have inside my .login
#!/bin/bash
export... (9 Replies)
Hi,
We currently have a Makefile which has the following option in LDFLAGS:
LDFLAGS_solaris= -G -library=%none
Can anyone please help on what the significance of -library=%none is ?
Thanks in advance. (1 Reply)
Hi all!
I need to add new environment variable.
e.g. # setenv LD_LIBRARY_PATH "/usr/ucblib:"
#
I check:# env
LD_LIBRARY_PATH=/usr/ucblib:
After rebooting I don't see this variable.
Why don't save this variable?
Thanks. (5 Replies)
hi
Im using HP-UX 11i,PARISC .... Where do i find SHLIB_PATH or LD_LIBRARY_PATH ,
i couldnt find in env, listing...... Moreover im trying to execute file its throwing me error
usr/lib/dld.sl: Can't find path for shared library: libgcc_s.sl
/usr/lib/dld.sl: No such file or directory... (3 Replies)
Hello
I have just tried to install ns-allineone-2.31 on cygwin
cygwin is using the bash shell
it asks for somethings to be put into the LD_LIBRAY_PATH, here is a snippet of what it says.
(1) You MUST put /home/Chris/ns-allinone-2.31/otcl-1.13, /home/Chris/ns-allinone-2.31/lib, into your... (1 Reply)
Hi,
This question deals with Solaris 2.8 and setuid programs. From research I've done so far, setuid programs ignore LD_LIBRARY_PATH; I've proven this and am OK with it. The thing I am not certain of how the C compiler is supposed to behave when it is invoked via a setuid program. Basically,... (0 Replies)