NVIDIA-CURRENT-DEV: LD_LIBRARY_PATH has three libGL.so* (32,64=mesa,current)

Asked by marshats

$ uname -a
Linux ubuntu-11-10-amd64 3.0.0-14-generic #23-Ubuntu SMP Mon Nov 21 20:28:43 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux

$ g++ main.c -lX11 -lGL -lpng -std=c++0x
undefined reference to `glGetActiveUniformName'

$ g++ main.c -L/usr/lib/nvidia-current -lX11 -lGL -lpng -std=c++0x
all is ok, but ^^^^^^^^^^^^^^^^^^^^^^^^^ had to be manually add above
compiles and runs fine with above library path specification

Why should I have to choose manually the -L/usr/lib/nvidia-current to get g++ to compile a openGL 3 code?

It appears that there are three distinct libGL.so files in the LD_LIBRARY_PATH and by default the MESA one seems to be first -- Definatley do not want this since that is only software and openGL 2.1. I am coding openGL 3+ in c/c++.

Here's a more complete list of the exact library files and the LD_LIBRARY_PATH

$ cat /etc/ld.so.conf.d/*.conf | grep -E "x86_64-linux-gnu|nvidia-current"
/usr/lib/nvidia-current
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
/usr/lib/nvidia-current
/usr/lib32/nvidia-current

$ locate libGL.
/usr/lib/nvidia-current/libGL.so
/usr/lib/nvidia-current/libGL.so.1
/usr/lib/nvidia-current/libGL.so.280.13
/usr/lib/x86_64-linux-gnu/libGL.so
/usr/lib/x86_64-linux-gnu/mesa/libGL.so
/usr/lib/x86_64-linux-gnu/mesa/libGL.so.1
/usr/lib/x86_64-linux-gnu/mesa/libGL.so.1.2
/usr/lib32/nvidia-current/libGL.la
/usr/lib32/nvidia-current/libGL.so
/usr/lib32/nvidia-current/libGL.so.1
/usr/lib32/nvidia-current/libGL.so.280.13

$ ls -alF /usr/lib/nvidia-current/libGL.so /usr/lib/nvidia-current/libGL.so.1 /usr/lib/nvidia-current/libGL.so.280.13 /usr/lib/x86_64-linux-gnu/libGL.so /usr/lib/x86_64-linux-gnu/mesa/libGL.so /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1 /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1.2 /usr/lib32/nvidia-current/libGL.la /usr/lib32/nvidia-current/libGL.so /usr/lib32/nvidia-current/libGL.so.1 /usr/lib32/nvidia-current/libGL.so.280.13
-rw-r--r-- 1 root root 652 2011-07-27 17:57 /usr/lib32/nvidia-current/libGL.la
lrwxrwxrwx 1 root root 10 2011-10-10 11:40 /usr/lib32/nvidia-current/libGL.so -> libGL.so.1
lrwxrwxrwx 1 root root 15 2011-10-10 11:40 /usr/lib32/nvidia-current/libGL.so.1 -> libGL.so.280.13
-rw-r--r-- 1 root root 794628 2011-10-10 11:41 /usr/lib32/nvidia-current/libGL.so.280.13
lrwxrwxrwx 1 root root 10 2011-10-10 11:40 /usr/lib/nvidia-current/libGL.so -> libGL.so.1
lrwxrwxrwx 1 root root 15 2011-10-10 11:40 /usr/lib/nvidia-current/libGL.so.1 -> libGL.so.280.13
-rw-r--r-- 1 root root 1025968 2011-10-10 11:41 /usr/lib/nvidia-current/libGL.so.280.13
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! why is there anything referenceing MESA when NVIDIA is installed ??? !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
lrwxrwxrwx 1 root root 13 2011-08-10 01:20 /usr/lib/x86_64-linux-gnu/libGL.so -> mesa/libGL.so !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
lrwxrwxrwx 1 root root 10 2011-08-10 01:20 /usr/lib/x86_64-linux-gnu/mesa/libGL.so -> libGL.so.1
lrwxrwxrwx 1 root root 12 2011-11-19 20:31 /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1 -> libGL.so.1.2
-rw-r--r-- 1 root root 372400 2011-08-10 01:21 /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1.2

Should I report this as a bug?

Is it ok to just change the link from /usr/lib/x86_64-linux-gnu/libGL.so -> mesa/libGL.so
to the proprietary one (but which one?) ie /usr/lib/x86_64-linux-gnu/libGL.so -> /usr/lib/nvidia-current/libGL.so ?

Is there a way to just run nvidia's sh file directly instead of using ubuntu ... it was easy enough in the pre-11.10 days
to simply
sudo services gdm stop
sudo sh NVIDIA-downloaded-directly-driver.sh
sudo service gdm start
everytime the old ubuntu updated the kernel

In fact, I would prefer to have the latest NVIDIA drivers (coding openGL shaders and openCL)

Question information

Language:
English Edit question
Status:
Expired
For:
Ubuntu nvidia-graphics-drivers Edit question
Assignee:
No assignee Edit question
Last query:
Last reply:
Revision history for this message
marshats (one-coloradan) said :
#1

Follow-up on inability to link openGL3/4 when NVIDIA proprietary driver from nvidia-current package installed:

1) /etc/ld.so.conf.d/*.conf files determine RUNTIME search of dynamic libraries, and LD_LIBRARY_PATH is also runtime only. Both therefore do not help the link stage.

2) problem is at link stage before 1) so g++ -"print-search-dirs" is relevant instead giving g++ library search path on my machine
libraries
 = ...
/usr/lib/x86_64-linux-gnu/
...
/usr/lib/

Important to notice that nowhere is /usr/lib/nvidia-current in g++ search path but instead finds first instance of libGL.so at
 /usr/lib/x86_64-linux-gnu/

3) PROBLEM is that this is a link from 2) is MESA: /usr/lib/x86_64-linux-gnu/libGL.so -> mesa/libGL.so
and that contains no symbols for openGL beyond openGL 2.1!!!! Hence cannot compile any openGL 3/4 programs.

4) Looking at old ubuntu distribution, libGL.so was installed in the standard /usr/lib/ and either MESA or NVIDIA/ATI was present -- never both simultaneously -- This seems to be a bug to me that when proprietary driver is installed there exists a remnant of mesa:libGL.so in the g++ library search path.

5) note if you think setting LIBRARY_PATH might be a fix, I observed that it doesn't prepend the desired path
for example, to make it more visible used string substitution "./Z________Z" instead of "/usr/lib/nvidia-current"
export LIBRARY_PATH=./Z________Z
marshats@ubuntu-11-10-amd64:~$ g++ -print-search-dirs
libraries: =
./Z________Z/x86_64-linux-gnu/4.6.1/
./Z________Z/x86_64-linux-gnu/
./Z________Z/../lib/
{... edited out cruft ...}
/usr/lib/x86_64-linux-gnu/
{... edited out cruft ...}
./Z________Z/
{... edited out cruft ...}
notice the "/usr/lib/nvidia-current" would still end up AFTER /usr/lib/x86_64-linux-gnu/ which still finds MESA libGL first

6) propose FIX bug with:
cd /usr/lib/x86_64-linux-gnu
sudo ln -sf /usr/lib/nvidia-current-updates/libGL.so libGL.so (if using nvidia-current-updates package)
or
sudo ln -sf /usr/lib/nvidia-current/libGL.so libGL.so (if using nvidia-current package)

7) propose alternative to FIX bug:
 install the propritary driver in the standard location /usr/lib (not in this /usr/lib/nvidia-current approach)

Revision history for this message
Launchpad Janitor (janitor) said :
#2

This question was expired because it remained in the 'Open' state without activity for the last 15 days.