Вам не нужны флаги.
Calling convention modifiers, такие как __thiscall
и __cdecl
, изменить имя функции внутри. Таким образом, __thiscall abc::Test::~Test(void)
является не такая же функция, как __cdecl abc::Test::~Test(void)
. Чтобы исправить это, измените __thiscall
на __cdecl
.
IIRC, __cdecl
- соглашение по умолчанию для MSVC (компилятор Visual Studio), поэтому, если ваш коллега не указал ничего особенного, dumpbin будет описывать функцию как имеющую соглашение о вызове __cdecl
.
Объяснение:
В отличие от C, внутреннее имя C++ функции, методы и объекты не так же, как те, в ваших исходных файлов. Это называется name mangling (иногда называется название украшения). Имя коверкание позволяет функциям быть перегружен, то есть, есть несколько функций, которые отличаются только по типу аргумента, а также членство класса/пространства имен и т.д.
Предположим, у меня есть следующая программа C:
// Foo.c
#include <stdio.h>
void myPrint(void) {
printf("Hello, World!\n");
}
void myPrint(const char* str) {
printf(str);
}
int main() {
myPrint();
myPrint("Hello, World!\n");
}
Если вы пытаетесь скомпилировать его как код C:
$ gcc -o Foo Foo.c
Foo.c:7:6: error: redefinition of ‘myPrint’
Но если попытаться скомпилировать это как C++:
$ g++ -o Foo Foo.c
Он компилируется.
Если вы пытаетесь просмотреть сборку с g++ -o Foo.s Foo.cpp -S -Os
, вы увидите, что искаженное имя void myPrint(void);
функции является _Z7myPrintv
(конечными v
стендов для void
), в то время как искаженное имя void myPrint(const char*);
функции является _Z7myPrintPKc
(PKc
: Указатель на Konstant Чар).
Кстати, искаженное имя функции зависит от используемого вами компилятора. С MSVC (компилятор Visual Studio) void myPrint(const char*);
имеет следующее поврежденное имя: [email protected]@[email protected]
.
Вы определили деструктор? – Raindrop7
Скорее всего, вы компилируете свою тестовую программу с различными параметрами компилятора, чем то, с чем собрал ваш коллега. Разница в вызове конвенции заставляет меня поверить в это. – PaulMcKenzie
@ Raindrop7: деструктор определен – carlo