C++ 复制和粘贴。这样文件就不会';不能使用链接器
我在我的home目录中编译并构建了CasabaCa C++休眠库,其中我的绝对路径是必需的。所以文件是代码> /home /Def/CasabaChan/Spabp/Budio。我想做的是简单地C++ 复制和粘贴。这样文件就不会';不能使用链接器,c++,linux,c++11,dynamic-library,casablanca,C++,Linux,C++11,Dynamic Library,Casablanca,我在我的home目录中编译并构建了CasabaCa C++休眠库,其中我的绝对路径是必需的。所以文件是代码> /home /Def/CasabaChan/Spabp/Budio。我想做的是简单地cp,然后通过.so文件到/usr/lib/。默认lib搜索路径。/,这样我就可以轻松地用以下命令链接它: g++ index.cpp -I/home/dev/casablanca/Release/include -lcpprest -std=c++11 它编译得很好,但是当我运行/a.out时,我得到
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对象的原因是编译器以某种方式保留了对它的引用。如何在不同的路径中安装此二进制文件?您所指的部分由开关进行调整:
g++-Wl,-rpath,/path/to/lib…我在linux debian()上用过程编译了卡萨布兰卡 编译后,我得到一个libcpprest.so(objdump): SONAME libcpprest.so.2.2 因此,您可能需要将libcpprest.so.2.2复制到/usr/lib/libcpprest.so.2.2 或者使用ldconfig工具来执行此操作 查看Release/build.Release/binary,您会发现:
libcpprest.so -> libcpprest.so.2.2
libcpprest.so.2.2
那么libcpprest.so只是一个链接,真正的库是libcpprest.so.2.2“runs just fine不应运行,因为运行时
-L
未设置任何搜索路径。你可能没有讲完整的故事。对可执行文件和库使用ldd
,并确保环境在所有情况下都是相同的。还有,这是什么usr/lib/。
?您是否以root用户身份运行并将所有内容转储到/usr
?我认为问题可能在于.so链接所针对的.o文件太多。如果.so更改目录,则可能会断开这些链接。这是我的猜测。“如果.so更改目录,它可能会断开这些链接。”。除非你指示链接器这样做,而你没有这样做。您是否在可执行文件和库中使用了ldd
?输出中有什么可疑的地方吗?呃,我放弃了,我只需要通过/usr/lib中的lib将cmake文件修改为。我想你还需要构建一个符号链接libcpprest.so->libcpprest.so.2.2我今天早上很快就完成了,在完成之前必须离开。我更新了我的答案。因为它是一个相对链接,所以复制它是不够的,您也必须复制源链接。