Прежде всего public class Foo : IFoo<T> {}
не компилируется, потому что вам нужно указать класс вместо T, но если вы сделаете что-то вроде public class Foo : IFoo<SomeClass> {}
, то если вы
Foo f = new Foo();
IBar<SomeClass> b = f as IBar<SomeClass>;
if(b != null) //derives from IBar<>
Blabla();
Во время компоновки вы можете попросить компоновщика сообщить вам, в каком входном файле (объектный файл, член статической библиотеки или совместно используемая библиотека) он находит определение любого символа и в каких файлах он находит этот символ, на который ссылаются, используя опцию компоновщика. -trace-symbol=name
.
Например:
$ cat main.c
extern void foo(void);
int main(void)
{
foo();
return 0;
}
$ cat foo.c
#include <stdio.h>
void foo(void)
{
fputs(__func__,stdout);
}
Скомпилировать источники:
$ gcc -Wall -c main.c foo.c
Создать статическую библиотеку:
$ ar rcs libfoo.a foo.o
Связать программу, запрашивающую трассировки символов для foo
и fputs
:
$ gcc -o prog main.o -L. -lfoo -Wl,-trace-symbol=foo,-trace-symbol=fputs
/usr/bin/ld: main.o: reference to foo
/usr/bin/ld: ./libfoo.a(foo.o): definition of foo
/usr/bin/ld: ./libfoo.a(foo.o): reference to fputs
/usr/bin/ld: //lib/x86_64-linux-gnu/libc.so.6: definition of fputs
Таким образом, foo
определено в элементе архива foo.o
из ./libfoo.a
, а fputs
определено в /lib/x86_64-linux-gnu/libc.so.6
Я только что написал сценарий в пятницу, чтобы сделать это почти точно. Этот скрипт находит как определенные, так и неопределенные ссылки на символ в данном каталоге:
#!/bin/bash
#findsym.sh
PATTERN=${1:-"symbol"}
OBJDUMP=armdir/arm-linux-gnuabi-objdump
for f in $(find . -name "*.so" -o -name "*.[ao]"); do
${OBJDUMP} -tT $f 2>/dev/null | grep -q ${PATTERN} 2>/dev/null
[[ ${PIPESTATUS[0]} -eq 0 && ${PIPESTATUS[1]} -eq 0 ]] || continue
echo "FILE: $f"
${OBJDUMP} -tT $f | grep ${PATTERN}
echo
done
Использование:
findsym.sh g_queue_pop_nth
Вам придется изменить путь к objdump, и если просматривая сгенерированные C ++ файлы, вы можете добавить -C
к вашим флагам objdump.