2012-04-02 122 views
3

我试图将我的程序链接到共享库。我使用makefile来编译。它看起来像这样:`共享库,makefile。库路径

make: sms_out.cpp SMSDispatch.cpp SMSDispatch.h 
     g++ -c -fPIC SMSDispatch.cpp -o SMSDispatch.o 
     g++ -shared SMSDispatch.o -o libSMSDispatch.so 
`  g++ sms_out.cpp -L. -lSMSDispatch -o sms_out 

,如果我在命令窗口中运行该程序,它工作正常:

LD_LIBRARY_PATH="." ./sms_out 

但我只想与./sms_out运行它,有人可以帮我吗? 试图将export LD_LIBRARY_PATH=.添加到生成文件,但没有工作,只是当我尝试运行程序时,收到错误“加载共享库时出错:libSMSDispatch.so:无法打开共享目标文件:没有这样的文件或目录”。

回答

2

加入其中.so文件所在的目录LD_LIBRARY_PATH

$ export LD_LIBRARY_PATH=/dir/containing/sharedobject 

可能对你有用的实用程序是ldd,打印共享库的依赖关系。例如:

 
    $ ldd /bin/ls 
     linux-vdso.so.1 => (0x00007fff819ff000) 
     librt.so.1 => /lib64/librt.so.1 (0x00007fc0d3f67000) 
     libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fc0d3d4a000) 
     libacl.so.1 => /lib64/libacl.so.1 (0x00007fc0d3b42000) 
     libc.so.6 => /lib64/libc.so.6 (0x00007fc0d37e9000) 
     libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fc0d35cd000) 
     /lib64/ld-linux-x86-64.so.2 (0x00007fc0d4170000) 
     libdl.so.2 => /lib64/libdl.so.2 (0x00007fc0d33c9000) 
     libattr.so.1 => /lib64/libattr.so.1 (0x00007fc0d31c4000) 

如果共享对象不是可定位的字符串未找到,或相似的,显示,而不是所使用的路径的共享对象。

+0

我想告诉正在运行的程序库,它正在查找的库位于Im文件夹中,也是“。”,它可以很好地与LD_LIBRARY_PATH =工作。 。/ sms_out',或者在运行程序之前使用'export LD_LIBRARY_PATH = .'。但是,如果我尝试将'export LD_LIBRARY_PATH = .'添加到makefile,那么在调用makefile之后尝试运行该程序时,它并不起作用。你知道为什么吗? – Veronic 2012-04-02 12:41:44

+0

运行makefile后检查'LD_LIBRARY_PATH'的值:不能像'export'这样的变量,'export'只会影响运行脚本的进程。我不知道从makefile修改环境变量的方法(这不是说一个机制不存在,我只是不知道其中的一个)。如果你有一个包含'export'语句的脚本,你可以通过调用它来改变环境,如:'$。 。/ myexport.sh' – hmjd 2012-04-02 12:45:37

+0

好的,但我可以把导出语句放入我想运行的文件(sms_out.cpp)吗?顺便说一句,运行makefile后LD_LIBRARY_PATH的值为空白,在我运行之前我认为它是空白的 – Veronic 2012-04-02 13:01:38

3

另一个选项 - 为链接器提供-rpath选项以通知您的二进制文件在哪里搜索动态对象。

g++ -Wl,-rpath=<path to .so> -o <your binary here> <cpp file name>.cpp