我试图将我的程序链接到共享库。我使用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=.
添加到makefile,但是没有用,只是在加载共享库时出现错误“错误:libSMSDispatch.so:无法打开共享对象文件:没有这样的文件或目录”当我尝试运行程序
答案 0 :(得分:3)
另一个选项 - 为链接器提供-rpath选项,以通知二进制文件在哪里搜索动态对象。
g++ -Wl,-rpath=<path to .so> -o <your binary here> <cpp file name>.cpp
答案 1 :(得分: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)
如果共享对象不可定位,则会显示 not found 或类似字符串,而不是显示正在使用的共享对象的路径。