Я в основном новичок в Visual Studio, поэтому прошу прощения, если это основная проблема. У меня есть решение, в котором есть несколько проектов. В проекте A у меня есть уже существующий набор файлов, в который я добавил новый класс. Проект B использует функциональность, закодированную в этом новом классе в Project A. Сначала создается проект A, и создается файл .lib, и этот файл .lib связан с проектом B. Однако, когда я перехожу к созданию файла .lib для Project BI получить ошибку ссылки, ссылающуюся на новые функции в Project A, которые я добавил. Используя команду dumpbin с файлом .lib, сгенерированным из проекта A, я замечаю, что символов для добавленных мною функций нет. Однако файл .obj, созданный после компиляции нового класса в проекте A, действительно содержит эти символы. Есть идеи, почему этих символов нет в файле .lib Project A?
Проблема компоновщика Visual Studio 2005
Ответы (1)
Я предполагаю, что это оба проекта DLL. В Windows вам нужно либо экспортировать символы, украсив их __declspec(dllexport)
, либо вам нужно использовать файл .DEF, чтобы указать, какие символы экспортировать.
В __declspec
это обычно достигается созданием заголовка примерно такого типа:
#ifdef PROJECT_A_EXPORTS
#define PROJECT_A_API __declspec(dllexport)
#else
#define PROJECT_A_API __declspec(dllimport)
#endif
Затем, когда вы хотите экспортировать всех членов класса, вы пишете:
class PROJECT_A_API MyClass
{
// ...
};
И определите PROJECT_A_EXPORTS
при компиляции проекта A, но не проекта B. Таким образом, вы можете использовать один и тот же файл заголовка MyClass.h для обоих проектов. При компиляции проекта A вы экспортируете символы, а при компиляции проекта B вы импортируете символы.
Вот некоторая информация о маршруте файла DEF. Однако это может быть сложно поддерживать, и в C ++ вам нужно перечислить оформленное имя каждого символа, что может быть проблемой.