Ссылка на статическую библиотеку с управляемыми компонентами - PullRequest
2 голосов
/ 17 февраля 2011

После создания графического интерфейса для моего личного небольшого приложения я пытаюсь скомпилировать его как статическую библиотеку для использования в другом проекте.GUI создан и выполняет другие задачи с помощью управляемого публичного класса ref, который в настоящее время имеет только 5 функций, но будет добавлен в него.

Это мой заголовочный файл в статической библиотеке, который будет включен вдругой проект (ну, по крайней мере, новый, с только общедоступными функциями, все лишние вещи будут удалены);

#ifndef GUIInterface_H
#define GUIInterface_H
#include 
#include "MainForm.h"

using namespace System;
using namespace System::Threading;

 public ref class GUIInterface
{
private:
    ThreadStart^ GUIThreadDelegate;
    Thread^ GUIThread;
    void GUIThreadFunction()
    {
        ANNGUI::Application::EnableVisualStyles();
        ANNGUI::Application::Run(gcnew ANNGUI::MainForm());
        return;
    }

public:
    int CreateGUI();

    int DestroyGUI();

    int GetInputData();

    bool CheckNewInput();

    int NetworkState();
};
#endif

Это способ доступа к нему из другого проекта (.exe)

#include "main.h"

int main()
{
    GUIInterface ^GUI = gcnew(GUIInterface);
    GUI->CreateGUI();
    return 0;
}

Файл main.h просто содержит определения классов, такие как заголовочный файл, показанный выше, за вычетом личных данных.

Я использую Visual Studio 2010 Express C ++.Оба проекта скомпилированы с ключом / clr.Статическая библиотека установлена ​​как ссылка в проекте .exe.Когда я вместо этого компилирую статическую библиотеку как DLL, программа работает отлично (после того, как я удалил main.h из приложения).Когда она скомпилирована как статическая библиотека, я получаю сообщение об ошибке LNK2020 для каждой из функций, используемых для связи с графическим интерфейсом.

Я связал .exe с параметром / VERBOSE, чтобы увидеть вывод.Компоновщик смотрит точно, где находится .lib несколько раз, но никогда не говорит, что нашел его, даже если он ищет ТОЧНО правильный путь и правильный файл.Кроме того, если это что-то значит, мой .lib работает нормально, но получает это как предупреждение.

.NETFramework,Version=v4.0.AssemblyAttributes.obj : warning LNK4221: This object file does not define any previously undefined public symbols, so it will not be used by any link operation that consumes this library

Мой вопрос: почему компоновщик ищет в .lib правильное место, но не видит его?прямо перед его лицом?Как я могу исправить это, чтобы я мог использовать свой статический .lib?

1 Ответ

4 голосов
/ 17 февраля 2011

Статический .lib не является допустимым целевым параметром для управляемого кода.Не существует реализованного механизма, позволяющего получать все важные метаданные, связанные с управляемыми типами, таким же образом, как и код.Его нельзя разрезать на кусочки и снова склеить.Команда MSFT, вероятно, рассмотрела это, но была напугана огромными изменениями, необходимыми для формата файла .obj.Это предположение.Хорошее сообщение об ошибке было бы хорошо.Это факт.

Вы должны выбрать DLL в качестве цели.Во время выполнения JIT-компилятор выполняет ту же функцию, что и компоновщик, он только извлекает код из сборки DLL, которая фактически используется клиентом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...