Что использовала статическая библиотека?Визуальная студия?Какая версия?
Я попытаюсь объяснить возникшую проблему.
Прежде всего, причина, по которой это работает, когда вы помещаете тело функции в заголовок, заключается в том, что это, по сути, вызывает тело функции.быть перекомпилированным вашим приложением.На самом деле компоновщику больше не нужно разрешать какие-либо символы из статической библиотеки.Следовательно, проблема с компоновщиком исчезла.
Проблема в том, что когда статическая библиотека была скомпилирована, компилятором была экспортирована функция, которую она экспортирует Test::TestFunc
(по сути, она переименовывает ее в соответствии с некоторой внутренней схемой).Перенос имени функции - это то, что делает компилятор, чтобы упростить разрешение символов для компоновщика.Способ искажения имени функции не определен в соответствии со стандартом c ++.Поэтому разные компиляторы с разными настройками будут по-разному манипулировать именами функций.
Когда вы пытаетесь создать приложение, связывающее эту библиотеку, Visual Studio теперь манипулирует функцией там, где она называется (вероятно, в main()
).Если искажение имени статической библиотеки, в которой определена функция, не совпадает с искажением имени, из которого вызывается функция, то вы получите ошибку, которую получили.То есть, компоновщик будет искать функцию X
в статической библиотеке, и все, что он может найти, это функция Y
.
Теперь, как указывали другие авторы, искажение имени также зависит отпараметры, которые функция принимает в качестве входных данных.Если типы параметров различаются в двух местах (определение и использование), компилятор будет по-разному манипулировать именами функций.Поэтому, опять же, компоновщик не сможет разрешить совпадение.
Суть в том, что в обоих местах, где существует символ (библиотека и приложение), символ ДОЛЖЕН бытьизуродованы одинаково.Лучший способ сделать это - это скомпилировать с использованием точно такого же компилятора с точно такими же настройками.
Другая возможность, конечно, заключается в том, что символ фактически не существует в статической библиотеке, с которой вы ссылаетесь!