1

我在我的主目录中编译并构建了 casablanca c++ rest 库,我的必要 .so 文件的绝对路径是 .so 文件/home/dev/casablanca/Release/build.release/Binaries/libcpprest.so。我想要做的是简单地cp将 .so 文件传递/usr/lib/..​​到默认 lib 搜索的路径,../以便我可以轻松地将其与以下命令链接:

g++ index.cpp -I/home/dev/casablanca/Release/include -lcpprest -std=c++11

编译得很好,但是当我运行 ./a.out 时,我得到了典型的运行时错误:

couldn't load shared library: libcpprest.so

即使在将 libcpprest.so 的默认路径添加到 LD_LIBRARY_PATH 之后。

但是,如果我将最初创建二进制文件的目录链接到:

// ./a.out runs just fine
g++ index.cpp -I/home/dev/casablanca/Release/include \
   -L/home/dev/casablanca/Release/build.release/Binaries -lcpprest -std=c++11

我猜我不能简单地将 .so 对象移动到我想添加它的原因是编译器以某种方式保持对它的引用。如何将此二进制文件安装在不同的路径中?

4

2 回答 2

1

您所指的部分由rpath开关调整:

g++ -Wl,-rpath,/path/to/lib ...

于 2014-11-06T06:52:16.797 回答
1

我确实使用过程https://casablanca.codeplex.com/wikipage?title=Setup%20and%20Build%20on%20Linux&referringTitle=Documentation在我的 linux debian ( https://git01.codeplex.com/casablanca ) 上编译了 casablanca

编译后我得到了一个 libcpprest.so (objdump):

SONAME libcpprest.so.2.2

所以你可能想将 libcpprest.so.2.2 复制到 /usr/lib/libcpprest.so.2.2

或使用 ldconfig 工具来执行此操作。

查看 Release/build.release/Binaries 你会发现:

libcpprest.so -> libcpprest.so.2.2
libcpprest.so.2.2

那么libcpprest.so 只是一个链接,真正的库是 libcpprest.so.2.2

于 2014-11-06T07:38:48.523 回答