复制和粘贴 .so 文件不适用于链接器
Copy and pasting .so file doesn't work with linker
我在主目录中编译并构建了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上编译了casablanca(https://git01.codeplex.com/casablanca)带程序https://casablanca.codeplex.com/wikipage?title=Setup%20and%20Build%20on%20Linux&referringTitle=文档
编译后,我得到了一个带有(objdump)的libcpprest.so:
SONAME libcpprest.so.2.2
因此,您可能需要将libcpprest.so.2.2复制到/usr/lib/libcprest.so2.2
或者使用ldconfig工具这样做。
查看Release/build.Release/Binaries,你会发现:
libcpprest.so -> libcpprest.so.2.2
libcpprest.so.2.2
那么libcpprest.so只是一个链接,真正的库是libcppreset.so.2.2
您所指的部分由rpath开关调整:
g++-Wl、-rpath、/path/to/lib。。。
- FLTK 2.0构建和演示,适用于VS2019的2011年左右的代码库
- "string.h"在构建适用于iOS的qt应用程序中找不到消息
- 为什么 std::erase(std::erase_if) 不是适用于<algorithm>任何容器的模板?
- 为什么这适用于 G++ 而不是 CLANG?
- 为什么不区分大小写适用于 std::unordered_set的 std::hash 函数?
- 声明适用于 auto,但不能显式声明类型?
- 什么是通用运行时组件 #ifdef 适用于Windows(UWP)而不是iOS
- Windows 上的 Cmake 不添加共享库路径(适用于 linux)
- Typedef适用于结构,但不适用于枚举,仅适用于C++
- 为什么函数模板不理解 NULL,但适用于 nullptr
- 链接器读取库,但在其中找不到符号?未解析的外部符号,但仅适用于 Win32 而不是 x64
- Netbeans 8.1(适用于 C/C++)找不到我的编译器(gcc-6.0.0 开发版本)
- random_shuffle() 适用于 Windows,但不能在 Linux 上编译
- C++指针到方法模板推导在面向 x86 时不编译,但适用于 x64
- 不在异常中嵌入std::字符串的规则是否仍然适用于move构造函数
- 移动文件夹Windows c++:适用于Vista及以上版本,不包括XP
- 适用于Android的Qt找不到任何兼容的设备答案找到但不知道如何
- 在Windows 7上不起作用,但它适用于Windows 8 dll。
- 可变参数模板转换为 std::function<R(ARGS...)>适用于 GCC 而不是 MSVC2013,为什么?
- C++11 cmath 函数不在 std 命名空间中,适用于 android NDK w/gcc-4.8 或 clang