Управляемый неразрешенный токен C ++ - PullRequest
6 голосов
/ 01 июня 2009

Я новичок в управляемом C ++.

У меня есть два управляемых проекта C ++ в одном .sln, Project Lib и Project LibTest. LibTest использует Lib.

Lib прекрасно компилируется и ссылки. Проект настроен как .dll.

LibTest также скомпилирован как .dll, но когда он переходит в линковку, я получаю «неразрешенный токен» на все методы Lib :: Эти определения методов определены в файле Lib .cpp.

Если я перенесу определения в файл Lib.h, все будет работать.

Я уже изменил Ссылку LibTest, чтобы она зависела от проекта Lib.

Чего мне не хватает?

РЕДАКТИРОВАТЬ : Хорошо, вот именно то, что у меня есть, и оно все еще не работает.

Прежде всего, я использую Visual Studio 2008 SP1.

Во-вторых, когда я делал подобное упражнение в C #, оно работало нормально.

Я создал пустой проект C ++ CLR. Я добавил проект Lib. Я добавил управляемый класс. VSTD генерирует Lib.h и Lib.cpp. Конструктор генерируется автоматически.

Затем я добавил еще один проект в свое решение; Я назвал это LibTest. Я добавил еще один управляемый класс под названием LibTest. LibTest.h и LibTest.cpp создаются. Я пытался создать экземпляр Lib в конструкторе LibTest, но при связывании он просто сказал:

1> LibTest.obj: ошибка LNK2020: неразрешенный токен (06000002) Lib ::. Ctor

Вот точный код:

Lib Project (скомпилированный как .dll проект)

//Lib.h
#pragma once

ref class Lib
{
public:
  Lib(void);
};


//Lib.cpp
#include "Lib.h"

Lib::Lib(void)
{
}

Проект LibTest (скомпилирован как application.exe)

// LibTest.h
#pragma once

ref class LibTest
{
public:
  LibTest(void);
};

// LibTest.cpp
#include "LibTest.h"
#include "Lib.h"

LibTest::LibTest(void)
{
  Lib^ lib = gcnew Lib;
}

int main()
{
  return 0;
}

Ответы [ 4 ]

9 голосов
/ 02 июня 2009

Управляемый C ++ работает так же, как C # в отношении типов в разных сборках. Это означает, что вам нужно объявить ваш Lib класс как public:

public ref class Lib

И вы не должны включать Lib.h в ваш LibTest проект. Когда вы добавите ссылку на проект Lib, компилятор сможет разрешать любые найденные символы.

Ваш текущий код включает Lib.h, поэтому компоновщик ищет класс Lib в сборке LibTest и ищет там конструктор.

1 голос
/ 01 октября 2018

В проекте LibTest, свойство-> Свойства конфигурации-> Линкер-> Ввод-> Установить дополнительные зависимости, включая Lib.lib

1 голос
/ 01 июня 2009

Если вы используете управляемые расширения, правильная установка ссылки должна быть всем, что вам нужно.

Если вы используете стандартные функции C ++, вам, вероятно, нужно определить свои функции, используя __declspec(dllexport) и __declspec(dllimport). Подробнее см. В MSDN .

__declspec(dllexport) - это то, что добавляет определенные функции в библиотеку экспорта, а __declspec(dllimport) сообщает импортирующей библиотеке (LibTest), что ей необходимо импортировать эти символы из DLL.

0 голосов
/ 03 июня 2009

Вот последняя модификация, предложенная Бояном. Спасибо, Боян!

Примечание: не забудьте добавить "Lib" в ссылку "LibTest"!

Lib Project (скомпилированный как .dll проект)

// Lib.h

#pragma once

public ref class Lib
{
public:
  Lib(void);
};

// Lib.cpp

#include "Lib.h"

Lib::Lib(void)
{
}

Проект LibTest (скомпилирован как application.exe)

// LibTest.h

#pragma once

ref class LibTest
{
public:
  LibTest(void);
};

// LibTest.cpp

#include "LibTest.h"

LibTest::LibTest(void)
{
  Lib^ lib = gcnew Lib;
}

int main()
{
  return 0;
}
...