Как отключить удаление мертвого кода C++ в xcode
Я пытаюсь связать все символы без ссылок из нескольких статических библиотек (моих собственных библиотек) для моего приложения C++ xcode. Я перепробовал все свойства, относящиеся к "strip" (ища в свойствах "strip"), но символы без ссылок, в частности, классы, не связаны между собой.
Я также пробовал флаг -r компоновщика -r, но затем компоновщик жалуется только: "ld: -r и -dead_strip нельзя использовать вместе"
Я попытался добавить '-no_dead_strip' к флагам компоновщика, но затем компоновщик просто говорит мне, что -no_dead_strip игнорируется.
Я получаю одинаковые результаты как с "Apple LLVM", так и с "LLVM GCC".
Итак, мой вопрос: какой флаг (ы) компоновщика или целевые свойства я должен использовать, чтобы отключить удаление всего мертвого кода и принудительно связать классы, на которые нет ссылок?
1 ответ
Стандартный механизм связывания - т.е. использование -l
возможность связать .a
file будет интеллектуально отфильтровывать объектные файлы, которые не используются, поэтому причина, по которой символы отсутствуют в результирующем двоичном файле, заключается в том, что они на самом деле не связаны.
Если вы хотите получить все символы из одного архива, вы можете использовать флаг: -force_load libraryarchive
, используется как: -Wl,-force_load,libfoobar.a
где libfoobar.a
архив, из которого вы хотите получить все символы.
Чтобы получить все символы из всех архивов, вы должны использовать флаг компоновщика: -all_load
или если вы едете из gcc
/clang
флаг -Wl,-all_load
,
Это производит отвратительные таблицы символов, все же!