Я два файла 37064544_p1.cpp
& 37064544_p2.cpp
с тем же содержанием, как показано ниже:Как разрешаются внешние символы?
int add(int x,int y)
{
return x+y;
}
Я собирал их с помощью
g++ -c 37064544_p2.cpp -o 37064544_p2.o
g++ -c 37064544_p2.cpp -o 37064544_p2.o
и добавили их в архив с помощью
ar -rsc lib37064544pf.a 37064544_p1.o 37064544_p2.o
И
$ nm -s lib37064544pf.a
дает мне:
Archive index:
_Z3addii in 37064544_p1.o
_Z3addii in 37064544_p2.o
37064544_p1.o:
0000000000000000 T _Z3addii
37064544_p2.o:
0000000000000000 T _Z3addii
и
$ ar -t lib37064544pf.a
дает мне
37064544_p1.o
37064544_p2.o
У меня есть драйвер, который вызывает функцию _Z3addii
которая компилируется с
g++ -static 37064544driver.cpp -o 37064544driver.elf -L. -l37064544pf
Результат
Sum : 11
Вопросы
Как символ
_Z3addii
решённые?- В соответствии с индексом архива?
- Это порядок, в котором мы заполняем архив, используя
ar
?
Как я могу изменить этот заказ?
- Как я могу предотвратить
ar
от дубликатов символов?
Компилятор: г ++ 4.6.3
Хммм, я просто попробовал это по clang. Если вы скомпилируете с двумя файлами .o напрямую, вы получите дубликат символьной ошибки, но если вы поместите два файла .o в .a и скомпилируете их, тогда ошибки не будет. Я всегда думал, что .a - это просто удобный способ получить кучу файлов .o, но, похоже, это по-другому. – xaxxon
Флаг 'r' для ar кажется, что это означает, что вещи, добавленные в архив позже, заменят более ранние, хотя вместо этого он запускает его с q, я все равно не могу получить дублируемую символьную ошибку. Ли линкер перестает смотреть на один файл, когда он встречает первую запись для символа, который он ищет, может быть? – xaxxon
@xaxxon: 'Если вы скомпилируете с двумя файлами .o, вы получите дубликат символьной ошибки'. Да, но я не всегда в пользу этого ради удобства – sjsam