I have gone through all the solutions on stackoverflow as well as ask ubuntu.
I have a go program
package main
import "C"
//export Getint
func Getint() int {
return 2
}
func main() {}
and i have generated .so file for the same with name t.so and header file t.h
Now I would like to use this function in my C program. I have written the code but I don't know how to execute it.
#include <stdio.h>
#include <t.h>
int main()
{
int a;
a=Getint();
printf("number : %d",a);
return 0;
}
when I execute it with
gcc c.c t.so
it generates a.out file
but at the time of running a.out with ./a.out it gives error
./a.out
Error while loading shared libraries: t.so: can not open shared object file: no such file or directory exists.
then I tried with
gcc -c c.c -l t.so
so it generates c.o file and it is not executable.
Most probably your loader cannot find the library. Try to put the path to the directory where the libarry is located to LD_LIBRARY_PATH
prior to run your binary.
export LD_LIBRARY_PATH=/path/to/my/library
./a.out
You should use LD_LIBRARY_PATH
to let the dynamic linker find your shared library in the list. Syntax is similar to PATH
a list of directories separted by :
.
On OSX this environment variable is called DYLD_LIBRARY_PATH
.
You should use the linker option -rpath
, which tells the linker to add information in the executable program where to find runtime libraries like your .so
file.
This can be done using the GCC option -Wl
which instructs the GCC frontend program to pass an option to the linker:
$ gcc c.c t.so -Wl,-rpath=$(pwd)
This will pass -rpath=$(pwd)
to the linker, and $(pwd)
causes the shell to call the pwd
command to return the current directory.
As long as you don't move the library the program should work.
You can use the environment variable LD_LIBRARY_PATH
too, but it's not recommended.
.so files are shared object, meaning object that are available to all applications that need them.. that is, shared. Due to this characteristics, they need to be stored in a well known place. Also, they need to be indexed by the dynamic linker.
In linux for instance you typically have a file /etc/ld.so.conf where all directories where shared object are automatically read from are stored
So your options are:
Personally I prefer installing the .so file in a system library path