Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 复制和粘贴。这样文件就不会';不能使用链接器_C++_Linux_C++11_Dynamic Library_Casablanca - Fatal编程技术网

C++ 复制和粘贴。这样文件就不会';不能使用链接器

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时,我得到

我在我的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时,我得到了典型的运行时错误:

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我今天早上很快就完成了,在完成之前必须离开。我更新了我的答案。因为它是一个相对链接,所以复制它是不够的,您也必须复制源链接。