Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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
Unix ARM/QNX的交叉链接因间接/可传递依赖项而失败_Unix_Linker_Arm_Cross Compiling - Fatal编程技术网

Unix ARM/QNX的交叉链接因间接/可传递依赖项而失败

Unix ARM/QNX的交叉链接因间接/可传递依赖项而失败,unix,linker,arm,cross-compiling,Unix,Linker,Arm,Cross Compiling,我正在尝试为QNX/ARM编译一个简单的项目,它由一个主可执行文件和两个共享库liba和libb组成 main只依赖于liba,根本不使用libb中的任何内容。 liba依赖于libb。 所以依赖链是:main->liba->libb。因此,libb是main的间接/传递依赖项。 liba.so位于子目录liba/,libb.so位于子目录libb/ 我通过以下方式链接主目录: qcc -Vgcc_ntoarmv7le -Wl,--no-undefined -lang-c++ -o linkte

我正在尝试为QNX/ARM编译一个简单的项目,它由一个主可执行文件和两个共享库liba和libb组成

main只依赖于liba,根本不使用libb中的任何内容。 liba依赖于libb。 所以依赖链是:main->liba->libb。因此,libb是main的间接/传递依赖项。 liba.so位于子目录liba/,libb.so位于子目录libb/

我通过以下方式链接主目录:

qcc -Vgcc_ntoarmv7le -Wl,--no-undefined -lang-c++ -o linktest main.o -L$TARGET/lib -Llibb -Lliba -la
正如您所看到的,由于有两行-L,链接器在查找libb和liba时应该没有问题

当我使用QNX/ARM工具链编译时,我得到一个错误:

ntoarm-ld: warning: libb.so, needed by liba/liba.so, not found (try using -rpath or -rpath-link)
使用strace可以确认ld甚至从不查看libb/目录,尽管它是用-L指定的


为什么不在这里查看-L目录?

-lb
缺失
L
指定路径,而
L
指定实际库。在生成命令末尾添加
-lb

qcc -Vgcc_ntoarmv7le -Wl,--no-undefined -lang-c++ -o linktest main.o \
-L$TARGET/lib -Llibb -Lliba -la -lb

如果要消除此生成时间依赖性,请考虑使用LIBA通过Labb使用LBB使用.< /P> 更新:

正如tmcguire所指出的,共享库的间接链接行为因链接器而异。根据,负责的
ld
选项是
--无需复制dt条目
(有时称为
--无需添加
,在最新的
gcc
版本(>4.5?)中默认启用该选项

另一个有趣的选项是
——根据需要

--as needed
标志被传递给GNU链接器(GNU ld) 告诉链接器只链接库中生成的二进制文件 包含二进制本身实际使用的符号。此二进制可以 可以是最终可执行文件或另一个库


附加读数是,并且。

是的,我没有指定-lb,因为这是一个间接依赖项。我以为链接器会发现liba依赖于libb,因此会自动拉入libb。我的意思是,ld警告我它找不到libb。因此,它应该知道它需要与之链接,甚至忽略告诉它到哪里的-L查找libb。所以…在IRC上,我被告知此行为取决于所使用的链接器。有些自动拉入间接依赖项,有些则不拉入间接依赖项。这让我非常惊讶,我仍然想知道为什么ld完全忽略-L路径