Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.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
Linux 使用gcc/ld/cmake链接到特定的.so版本,拒绝其他版本_Linux_Gcc_Cmake_Shared Libraries - Fatal编程技术网

Linux 使用gcc/ld/cmake链接到特定的.so版本,拒绝其他版本

Linux 使用gcc/ld/cmake链接到特定的.so版本,拒绝其他版本,linux,gcc,cmake,shared-libraries,Linux,Gcc,Cmake,Shared Libraries,是否可以使用g++/cmake链接到特定的共享库,以便在目标计算机上不存在确切版本时,我的应用程序不会运行?最终,我不想使用任何我没有直接测试过的库版本 我看到了,但它不处理拒绝版本的情况 我知道动态链接器在某种程度上是通过的,例如libmylib.so.0不会链接到需要libmylib.so.1的应用程序。但是有没有一种方法可以在比SONAME提供的版本分辨率更高的情况下进行区分(例如,只有libmylib.so.1.5.3存在时才进行链接)?或者这只是一种不好的做法?“只有libmylib.

是否可以使用g++/cmake链接到特定的共享库,以便在目标计算机上不存在确切版本时,我的应用程序不会运行?最终,我不想使用任何我没有直接测试过的库版本

我看到了,但它不处理拒绝版本的情况


我知道动态链接器在某种程度上是通过的,例如libmylib.so.0不会链接到需要libmylib.so.1的应用程序。但是有没有一种方法可以在比SONAME提供的版本分辨率更高的情况下进行区分(例如,只有libmylib.so.1.5.3存在时才进行链接)?或者这只是一种不好的做法?

“只有libmylib.so.1.5.3存在时才链接”-使用
目标链接库(您的\u exe/path/to/libmylib.so.1.5.3)
。我确实尝试过,但生成的应用程序将链接到任何版本的libmylib.so.1上。我希望它在libmylib.so.1.6.3上失败,但由于它的SONAME也是libmylib.so.1,它成功地链接了.Hm,链接到
/path/to/libmylib.so.1.5.3
应该不会成功,除非确实存在给定的文件。如果文件不是符号链接,则链接器应存储其文件名(以
.so.1.5.3
结尾),这样文件应存在于目标计算机上,以便能够运行程序。你能出示你的密码吗?(与库链接的部分)。我刚刚意识到我们需要小心区分构建时链接(即在make期间)和动态链接(在运行时)。:)当你说“linking to/path/…”时,你指的是运行时吗?在我的cmake中,我通常有行target_link_库(my_target PRIVATE/path/to/fribidi-0.19.7/lib/libfribidi.so.0.3.6)。为了这个实验,我创建了一个名为libfribidi.so.0.4.0的伪版本,然后更新了我的cmake以匹配。我运行了cmake,链接良好。然后,我将我的_目标移动到具有libfribidi.so.0.3.6但不具有0.4.0的系统,它动态链接良好(可能是因为它找到了与libfribidi.so.0匹配的东西,soname)“只有libmylib.so.1.5.3存在时才有链接”-使用
目标链接库(您的_exe/path/to/libmylib.so.1.5.3)
,我就是这么做的,但是生成的应用程序将链接到libmylib.so的任何版本,因此该版本具有libmylib.so.1的SONAME。我希望它在libmylib.so.1.6.3上失败,但由于它的SONAME也是libmylib.so.1,它成功地链接了.Hm,链接到
/path/to/libmylib.so.1.5.3
应该不会成功,除非确实存在给定的文件。如果文件不是符号链接,则链接器应存储其文件名(以
.so.1.5.3
结尾),这样文件应存在于目标计算机上,以便能够运行程序。你能出示你的密码吗?(与库链接的部分)。我刚刚意识到我们需要小心区分构建时链接(即在make期间)和动态链接(在运行时)。:)当你说“linking to/path/…”时,你指的是运行时吗?在我的cmake中,我通常有行target_link_库(my_target PRIVATE/path/to/fribidi-0.19.7/lib/libfribidi.so.0.3.6)。为了这个实验,我创建了一个名为libfribidi.so.0.4.0的伪版本,然后更新了我的cmake以匹配。我运行了cmake,链接良好。然后,我将我的_目标移动到具有libfribidi.so.3.6但不具有0.4.0的系统,它动态链接良好(可能是因为它找到了与libfribidi.so.0匹配的soname)