Да, я тут немного поисследовал. Это на первый взгляд lib - просто сборище obj, на самом деле не всегда. Вот результаты (больше вопросов, чем результатов).
По dll больше инфы - поэтому стал делать ее, тем более, что lib при этом автоматом получается.
1. Делаем WIN32 проект. Из МСДН:
The __thiscall calling convention is used on member functions and is the default calling convention used by C++ member functions that do not use variable arguments.
Т.е. по умолчанию для функций-членов класса используется __thiscall. Экспортирую (lib/dll - неважно) функцию-член - вижу на выходе __thiscall. Но не у всех функций, а только не у статических. В том числе и у операторов.
Использую их в основном проекте. Функции нормально используются, находятся - все ОК.
А вот с операторами проблема. Линкер ищет не
bool __thiscall UTILS::operator!=()
а
bool __cdecl UTILS::operator!=()
Такой, конечно, не находит и выдает ошибку.
Кажется понял, почему так - потому что хочет использовать первый оператор != из следующего вопроса - friend оператор, а он не член - поэтому и ищет __cdecl.
Использую так:
UTILS::String dtr = _T("Проба!");
UTILS::String ppp = _T("Проба1");
if(dtr != ppp)
Следовательно вопросы:
>>В каком случае выбирается какой оператор.
>>Как заставить использовать второй?2. Почему-то не все операторы экспортируются.
Как экспортирую?:
class __declspec(dllexport) String
{
...
TH_FINLINE friend bool operator==(const String& a, const String& b) {...}
TH_FINLINE friend bool operator==(const String& a, const wchar_t* cStr) {...}
TH_FINLINE friend bool operator==(const wchar_t* cStr, const String& a) {...}
TH_FINLINE friend bool operator!=(const String& a, const String& b) {...}
TH_FINLINE bool operator!=(const String& a) {...}
...
}
Последний экспортируется всегда, а все friend нет. Вынес определение в cpp файл, убрал TH_FINLINE - не помогло. __declspec(dllexport) в cpp файл не вынести - ругается на повторный линк
>>Как экспортировать friend операторы (функции) в .dll?Дополнение: здесь можно попробовать использовать def файл. Вечером попробую...
3.
Есть проект Project1. В нем как .cpp, так и .h файлы. В другом проекте Project2 можно просто #include .h файлы из первого проекта и указать получаемую из первого проекта lib в зависимостях.
Однако в .cpp файлах первого проекта есть определение переменных типа:
HANDLE volatile Win32ProcessHeap = 0;
Они же при этом не инклюдятся!
Вот поэтому и нужно компилить не в .dll, а в .lib!!!
Если компилить в .dll, то такие переменные будут в .dll, а в попутно получающейся .lib их не будет. А вот если компилим в .lib, то все будет в ней и из второго проекта прекрасно видно. Вот и выходит, что lib не всегда просто сборище obj...
Что самое интересное - при этом начинают экспортироваться friend операторы, правда все-равно не все. Из трех операторов == видно только первый.
>>Почему остальные нет?Что удивительно в Debug экспортируется еще и второй оператор == (третьего все-равно не видно). Но что еще более удивительно - хоть они и не видны в экспортируемых, использовать их во втором проекте можно - все прекрасно работает и в Release и в Debug.
>>Каким образом работает, если не видно в экспортируемых?
Смотрел двумя вещами - просто F3 в TotalCommander (выдает заголовок lib), и Dumpbin.