Неразрешенный внешний символ при связывании lib, компилятор добавляет букву «A» к имени функции - PullRequest
2 голосов
/ 23 февраля 2010

Я получаю эту ошибку при попытке связать проект win32 exe. Я связал в библиотеке, которая содержит код для этого метода. Но все еще появляется неразрешенная ошибка символа.

error LNK2001: unresolved external symbol "public: bool __thiscall SharedJobQueue::AddJobA(class boost::shared_ptr<class domain::Job>)" (?AddJobA@SharedJobQueue@@QAE_NV?$shared_ptr@VJob@domain@@@boost@@@Z)

Почему написано AddJobA с 'A' в конце. Метод объявлен как AddJob.

Я просмотрел вывод 'dumpbin / symbols' , и он содержит только символы для AddJob, а не AddJobA. Почему компилятор добавляет 'A' в конец имени функции?

Ответы [ 3 ]

5 голосов
/ 23 февраля 2010

MS использует макросы для Win32 API для поддержки сборок Unicode и Ansi, добавляя имена функций с A или W.
AddJob () является функцией в Win32 API и поэтому имеет такой макрос - вы можете #undef AddJob избавиться от вашей проблемы.

4 голосов
/ 23 февраля 2010

И здесь мы видим проблему с макросами.

В вашем коде нет ничего плохого, проблема в библиотеках Windows. На самом деле есть функция с именем AddJob в заголовках Win32, но не совсем ... Не объявляйте функцию Addjob, но вместо этого добавьте AddJobA и функцию AddJobW, которые работают с не-Unicode и Unicode строки соответственно.

A в конце имени вашей функции происходит из-за макроса, определенного в заголовке окна, который был определен для работы с юникодом. По сути, они будут иметь что-то вроде:

#ifdef UNICODE
#  define AddJob AddJobW
#else
#  define AddJob AddJobA
#endif

Это позволяет людям просто использовать AddJob, и макросы будут указывать функции на правильную функцию Unicode / Non-Unicode. Проблема, конечно, в том, что #define влияет на все, что происходит с вашей функцией.

Чтобы это исправить, вы можете либо #undef AddJob, либо просто изменить имя своей функции на что-то, что не является функцией Win32.

1 голос
/ 23 февраля 2010

Функции Windows могут иметь A или W в конце функции - A означает ASCII, а W означает широкий код Unicode фиксированного размера. Настройки вашего проекта определяют, какая функция используется. addJob мог бы иметь W в конце, если у вас был включен юникод для вашего проекта ..

...