我们遇到了一个需要一周时间才能解决的问题。这是因为函数“ddot”在fortran程序(静态.a存档)以及C程序(在.so动态库中)中声明。链接器“ld”链接到错误的条目。
事实证明,当fortran函数从“ddot”重命名为“ddot_sparse”时问题得以解决。但我们花了一周的时间才找到它。
是否可以自动进行此类检测?事实上,链接器接受来自fortran的“ddot”和来自C库的“ddot”是合法的。这可以由链接器报告吗?
或者也许这是“ld”的错误,没有检测到这样的事情? ld的手册页说:“通常,当多次定义符号时,链接器将报告致命错误。”这显然不会发生在这里。
或者,是否有工具显示二进制可执行文件的各种符号之间的依赖关系树?这非常有用。为每个符号显示使用过的符号及其来源文件的内容。
答案 0 :(得分:1)
默认情况下,ld
应该按照先到先得的原则进行链接。例如
ld main.o -lfortran_archive -ldynamic_library
首先会针对libfortran_archive.a
中的所有符号链接,然后针对libdynamic_library.so
的其余符号进行链接。如果您交换链接顺序
ld main.o -ldynamic_library -lfortran_archive
然后你会有相反的效果。这将允许您确定哪个库具有优先级符号。
我不知道通用开关,它允许您在ld
上输出多个符号的警告。尤其是Linux和OS X带有不同的链接器。但是您可以使用nm
输出在目标文件/库中定义的所有符号的列表
cat <(nm -U libfortran_archive.a) <(nm -U libdynamic_library.so) \
| grep -o "[^ ]*$" | sort | uniq -c | grep -v "\s*1"