C++ C++;:影响运行时的库加载顺序
ubuntu 18.04 LTS作为WSL,visual studio 16.6.0,cmake 3.10。 问题是在运行时/之前加载库,而不是在编译时加载库(至少我这么认为): 我正在开发一个应用程序,它将曲面图写入C++ C++;:影响运行时的库加载顺序,c++,cmake,libjpeg,C++,Cmake,Libjpeg,ubuntu 18.04 LTS作为WSL,visual studio 16.6.0,cmake 3.10。 问题是在运行时/之前加载库,而不是在编译时加载库(至少我这么认为): 我正在开发一个应用程序,它将曲面图写入jpeg图像,并将图像与参考进行比较。jpeg编写器依赖于libjpeg.so,而比较部分依赖于libmwjpegreader.so 在写入第一个jpeg文件期间,生成和编译良好,但在执行时会导致分段错误(内核转储):显然,libjpeg和libmwjpegreader都实现了类似
jpeg
图像,并将图像与参考进行比较。jpeg编写器依赖于libjpeg.so
,而比较部分依赖于libmwjpegreader.so
在写入第一个jpeg文件期间,生成和编译良好,但在执行时会导致分段错误(内核转储)
:显然,libjpeg
和libmwjpegreader
都实现了类似的功能,并且出于某种原因,jpeg编写器使用libmwjpegreader
函数,而不是libjpeg
解决方法是在启动可执行文件之前使用LD_PRELOAD=libjpeg
,这将导致正确的行为。这可以通过LD_DEBUG=files./executable |&grep'calling init'
进行验证-库的加载顺序会改变,应用程序会按预期运行
是否可以在不依赖
LD_PRELOAD
的情况下调整库的加载顺序以执行?它与编译期间的链接顺序有关系吗?我正在使用CMAKE
作为构建环境,但包含libjpeg
或在cmakelists.txt
中移动位置都没有效果 我认为链接顺序应该影响生成的可执行文件,但这取决于链接器本身。你如何建立你的程序?我们是否可以查看构建日志(例如,如果使用make,则make VERBOSE=1
)readelf-d./executable
?我依靠visualstudio的神秘IDE魔法来构建项目。我可以提供。我目前的理解是,可执行文件有一个RPATH
属性,该属性ld。因此
在运行时首先检查,可以通过CMAKE修改。然而,我还不知道如何适当地修改它,我将避免使用以任何代价导出相同函数的库。。。可以将应用程序的比较部分移动到单独的可执行文件中吗?与使用冲突库相比,从主可执行文件运行此独立可执行文件的成本可能要小一些。我认为链接顺序应该影响生成的可执行文件,但这取决于链接器本身。你如何建立你的程序?我们是否可以查看构建日志(例如,如果使用make,则make VERBOSE=1
)readelf-d./executable
?我依靠visualstudio的神秘IDE魔法来构建项目。我可以提供。我目前的理解是,可执行文件有一个RPATH
属性,该属性ld。因此
在运行时首先检查,可以通过CMAKE修改。然而,我还不知道如何适当地修改它,我将避免使用以任何代价导出相同函数的库。。。可以将应用程序的比较部分移动到单独的可执行文件中吗?与使用相互冲突的库相比,从主可执行文件运行此独立可执行文件的成本可能要小一些。