почему результат загрузки двоичного файла между linux и arm так отличается?

#c

#c

Вопрос:

По сути, я хочу, чтобы моя основная программа была правильно связана с одной библиотекой ‘libA.so ‘, и символы ‘subFunc’ из этой библиотеки могут быть взяты из другой библиотеки (xxx), но эти символы ‘funcB’ не будут использоваться основной программой. Я компилирую их следующим образом: libA.so

 int subfunc(int a, int b);
int funcB(int a, int b) {
    return subfunc(a, b);
}

int funcA(int a, int b) {
    return a   b;
}
 

main.cc

 #include <stdio.h>
int funcB(int a, int b);
int main()
{
  funcB(1,2);
  printf("hellon");
  return 0;
}
 
 gcc --shared libA.cc -o libA.so
gcc main.cc libA.so -o main -Wl,--allow-shlib-undefined
 

./main
‘./main’ может нормально работать в Linux, но когда я их скомпилирую:

 aarch64-linux-gnu-gcc --shared libA.cc -o libA.so
aarch64-linux-gnu-gcc main.cc libA.so -o main -Wl,--allow-shlib-undefined
 

затем запустите на платформе ‘arm’,
‘./ main’ получить уведомление:
./main: ошибка поиска символов: libA.so : неопределенный символ: _Z7subfuncii

Любые советы для меня, я буду очень благодарен.

Комментарии:

1. Почему .cc , а не просто .c (вопрос, помеченный как c)? Возможно, кросс-компилятор пытается обработать исходный код как файл c из-за этого. Но это просто предположение, основанное на искаженном подобном имени _Z7subfuncii .

2. братан, спасибо за твой ответ. когда я использую g , в Linux точно есть «неопределенный символ: _Z7subfuncii». Но почему нет ошибки при использовании gcc в Linux.

3. добро пожаловать, и вы не знаете, почему нет ошибки.

4. Сообщение об ошибке undefined symbol: _Z7subfuncii имеет смысл: в libA.cc , вы объявили int subfunc(int a, int b); , но вы никогда не реализовали его. Неудивительно, что компилятор не может найти этот символ. Я думаю, вы также получите сообщение об ошибке на другом компиляторе, как только вы включите все предупреждения. ( -Wall --pedantic ).

5. Ксавер, спасибо за твой ответ. то, что вы сказали, правильно. Интересно, почему это работает с компилятором gcc. даже если ‘subfunc’ никогда не будет реализован.