共享库,makefile。图书馆路径

时间:2012-04-02 12:19:23

标签: c++

我试图将我的程序链接到共享库。我使用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:无法打开共享对象文件:没有这样的文件或目录”当我尝试运行程序

2 个答案:

答案 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 或类似字符串,而不是显示正在使用的共享对象的路径。