LINUX.ORG.RU

В dll «корявое» название функции

 , , ,


0

1

Добрый вечер. Нужно для приложения, которое работает под вайном сделать dll файл.

Вместо функции с названием qwe в dll файле есть работающая функция _Z3qwev. Эта функция работает так же как функция qwe. Такое поведение меня смущает, так как следующая версия компилятора может дать функции другое название. Как сделать так, чтобы название функции, которая дана в исходном коде и то, что в dll файле были одинаковыми?

По документации mingw и материалам, которые есть в интернете не нашел ответа

Программный код исходного файла такой:

int qwe() {
    return 1;
}

Компилирую так:

../../compiler/bin/i686-w64-mingw32-c++ -shared -o out.dll simple.cpp

Узнал, что имя функции не правильное, выполнив такую команду:

../../compiler/bin/i686-w64-mingw32-objdump -p out.dll | grep qwe
	[   2] _Z3qwev

Версия компилятора:

../../compiler/bin/i686-w64-mingw32-c++ --version
i686-w64-mingw32-c++ (GCC) 4.9.0 20130523 (experimental)
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Сама dll-ка http://yadi.sk/d/Mzl4ns-JMnGLj

★★

Вместо функции с названием qwe в dll файле есть работающая функция _Z3qwev

А зачем ты полез внутрь файла, не зная по каким принципам он создавался?

смущает, так как следующая версия компилятора может дать функции другое название

Хочешь огорчу тебя? Это технические названия, которые могут возникать в том числе и из-за оптимизатора. Ты уверен, что ты точно ту функцию нашёл? может омтимизатор разбил исходную на десяток разных и слил с другими?

ziemin ★★
()

Как сделать так, чтобы название функции, которая дана в исходном коде и то, что в dll файле были одинаковыми?

extern "C"
int qwe()
{
    return 1;
}
ilammy ★★★
()

На с++ никак. У плюсов нет ABI, в частности нет совместимости между разными компиляторами и версиями одного компилятора в общем случае. Можно только через extern «C», ну или писать код на си.

mashina ★★★★★
()

name mangling в C++ нестандартизирован, так что никак

stopitplease
()

Читайте про name mangling в c++ и способы решения «проблемы».

andreyu ★★★★★
()
Ответ на: комментарий от nanoolinux

Давай-ка без аргументов, а? Что. Уже и написать нельзя?

ziemin ★★
()
Ответ на: комментарий от nanoolinux

Умножаю всех регистрантов в треде на корень из двух.

i-rinat ★★★★★
()

Спасибо

dicos ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.