c++ - 复制和粘贴 .so 文件不适用于链接器

标签 c++ linux c++11 dynamic-library casablanca

我在主目录中编译并构建了 casablanca c++ rest 库,其中必要的 .so 文件的绝对路径是 /home/dev/casablanca/Release/build.release/Binaries/libcpprest.so。我想做的是简单地 cp 并将该 .so 文件传递​​到 /usr/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 对象移动到我想要添加它的位置的原因是编译器以某种方式保留了对它的引用。如何将此二进制文件安装到不同的路径?

最佳答案

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

关于c++ - 复制和粘贴 .so 文件不适用于链接器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26773076/

相关文章:

linux - Linux 内核中的 copy_from_user 在内部是如何工作的?

linux - Linux 的 CRD 主机 - "OAuth credentials are invalid"

c++ - 为什么在 std::shared_ptr 实现中需要两个指向托管对象的原始指针?

c++ - 为什么 win32 消息循环在线程化时停止工作?

c++ - 在单元测试中验证 static_assert

c++ - C++,自本地时间午夜起算的毫秒数

c++11 - 如何在 bcc32 上使用使用 bcc32c 构建的静态库

c++ - 是否存在程序员可能希望避免 bool 表达式的短路求值的合理场景?

linux - Corda 4.0 AWS 节点部署问题

c++ - C++ 标准是否要求有符号整数只有一个符号位?