G ++ linking - связывает только используемые символы - PullRequest
0 голосов
/ 09 июля 2019

У меня проблема при связывании кода c ++ с g ++.У меня есть два файла: file1 и file2:

file1:

int A(){
   return B();
}

int C(){
   return 0;
}
file2:

int B(){
   return 4;
}

Я создаю общую библиотеку, которая использует функцию C(), поэтому я компилирую только с file1, а не file2,У меня нет проблем при компиляции или компоновке, но когда я использую разделяемую библиотеку, при выполнении я получаю сообщение об ошибке, что B не определено.

Если я компилирую и связываю с file2 Iнет проблем.Но я не хочу этого решения, потому что у меня есть несколько рекурсивных включений.

Я попытался скомпилировать с --ffunctions-sections и --fdata-sections, а затем связать с -Wl,--gc-sections, но это не решило мою проблему.

Есть ли способ связать только те символы (здесь функции), которые я на самом деле использую?

1 Ответ

0 голосов
/ 09 июля 2019

Вы должны думать об общих библиотеках как о чем-то универсальном. Даже если вы хотите всегда брать одну книгу из библиотеки, другие могут захотеть брать другие книги. Поэтому либо удалите метод int A(), либо заставьте его работать, связав его с зависимостью.

G ++ предлагает оптимизацию во время компоновки (с параметром -flto при компиляции и компоновке). Но сделать метод int A() недоступным, а затем надеяться, что он будет оптимизирован, определенно не является чистым решением вашей проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...