Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.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++;:影响运行时的库加载顺序_C++_Cmake_Libjpeg - Fatal编程技术网

C++ C++;:影响运行时的库加载顺序

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都实现了类似

ubuntu 18.04 LTS作为WSL,visual studio 16.6.0,cmake 3.10。 问题是在运行时/之前加载库,而不是在编译时加载库(至少我这么认为):

我正在开发一个应用程序,它将曲面图写入
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修改。然而,我还不知道如何适当地修改它,我将避免使用以任何代价导出相同函数的库。。。可以将应用程序的比较部分移动到单独的可执行文件中吗?与使用相互冲突的库相比,从主可执行文件运行此独立可执行文件的成本可能要小一些。