库没有链接,即使存在于链接目标中

时间:2019-03-20 01:50:48

标签: c++ cmake

我正在尝试使用cmake构建应用程序,但是可执行文件无法链接到库,我的可执行文件的ldd看起来像这样

def editMenu(request):   
    db=credentials().database()
    mType = request['Menu_Type']
    rID=request['rID']
    iID =request['iID']
    print(request)
    request.pop("Menu_Type")
    request.pop('rID')
    request.pop('iID')




    return db.child('Restaurants').child(rID).child("Menu").child(mType).child(iID).update(request)

在执行--trace时,库已存在

linux-vdso.so.1 (0x00007ffd447a0000)
libavcodec.so.58 => /usr/local/ffmpeg/libavcodec.so.58 (0x00007f5673121000)
libavformat.so.58 => /usr/local/ffmpeg/libavformat.so.58 (0x00007f5672cdb000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f5671ffb000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f5671de3000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f56719f2000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f5671654000)
/lib64/ld-linux-x86-64.so.2 (0x00007f567629b000)
libswresample.so.3 => not found
libavutil.so.56 => not found
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f5671435000)
libavutil.so.56 => not found
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f5671231000)

即使 libswresample.so.3,libavutil.so.56 明显存在于make --trace出于某些原因应用程序未链接至该文件,另外,如果我将/我的LD_LIBRARY_PATH中的usr / local / ffmpeg文件夹一切正常。此外,找到了 libavcodec.so.58 。试图了解正在发生的事情以及如何解决它。谢谢。

1 个答案:

答案 0 :(得分:0)

通过链接这些库,您可以在二进制文件中根据需要标记它们,而无需记录任何路径。

默认情况下,系统仅在少数位置查找动态库。 您有几种选择:

  • /usr/local/ffmpeg添加到/etc/ld.so.conf.d/中的文件中(不要忘记调用ldconfig)。这将告诉您的动态链接器(ld.so)在那里。
  • 像以前一样,将/usr/local/ffmpeg添加到LD_LIBRARY_PATH环境变量中。您可以通过在某些计算机上编辑/etc/environment来使其永久化。这具有相同的效果,但是可以被用户覆盖。例如,大多数Linux上的游戏都依赖此工具来查找捆绑的库,但这确实需要启动器脚本。
  • 将您的二进制文件与-rpath=/usr/local/ffmpeg链接。这将通知动态链接器您也希望它也在那里。您可以通过设置INSTALL_RPATH目标属性在CMake中完成此操作。您可能还希望设置BUILD_WITH_INSTALL_RPATH,因此在开发过程中不必设置LD_LIBRARY_PATH或设置单独的BUILD_RPATH
  • 最后,您可以将ffmpeg库移动到默认搜索路径中的目录中。但是,这可能会与系统库发生冲突,并且需要root访问。这更像是最后一种手段或一切都方便的方法。