Я строю свой проект на C ++, используя clang++
, используя следующую команду командной строки (разбить на строки):
clang++
-std=c++11
-W -Wall -Wextra -pedantic -Wno-newline-eof -Werror
-O4
-I<dirs>
-L<dirs>
-l<libs>
-framework <frameworks>
-D <defs>
-o <filename>
<files>
Тем не менее, когда я бегу strings <filename>
несколько имен классов отображаются, несмотря на -O4
в командной строке. я пробовал -Wl,-s
который должен сказать llvm убрать все символы, но это не удаляет их.
Кажется, что имена классов, которые появляются, имеют одну общую черту: у них есть vtable. Один из этих классов:
class MyClass {
public:
virtual void myFunc() = 0;
};
Это отображается как символ:
N9namespace7MyClassE
Мне не нравится, что мое пространство имен и имена классов отображаются в конечном файле. Как мне их раздеть? Мой бинарный файл — это утилита командной строки, поэтому только main
Функция должна быть экспортирована.
Даже после поставки -fno-rtti
(как предложено @ n.m.), некоторые имена все еще остаются, такие как:
__ZN15MyClassInstance6myFuncEv
(MyClassInstance является подклассом MyClass выше)
Кроме того, даже имена глобальных переменных находятся в двоичном виде.
Я решил это, предоставив аргумент лязг -fno-rtti
, который отключает RTTI, функцию C ++, которую я в любом случае не использую.
-O4
не подразумевает strip
и последние несколько ссылок на мои имена классов можно удалить, выполнив strip
,
Других решений пока нет …