Странная проблема с связыванием C ++ / CLI - неразрешенные внешние символы, но заголовочный файл связан - PullRequest
3 голосов
/ 12 января 2012

Я пытаюсь сделать что-то очень простое в C ++ / CLI, однако у меня возникают проблемы с Visual Studio, и я не могу понять, почему.

У меня есть два проекта, один из которых содержитзаголовочный файл с именем JNIUtils.h.Его содержимое очень простое -

#pragma once

class JNIUtils
{
public:
    JNIUtils( void );
    ~JNIUtils( void );
};

, и его реализация очень проста -

#include "stdafx.h"

#include "JNIUtils.h"

JNIUtils::JNIUtils( void )
{

}

JNIUtils::~JNIUtils( void )
{

}

Все, что я пытаюсь сделать, - это создать объект этого вновь определенного типав другом проекте.В проекте, в который я включаю этот заголовочный файл, я перешел к

Свойства проекта> Свойства конфигурации> Каталоги VC ++> Включить каталоги

Я добавил запись с указанием пути, по которомуфайл заголовка, который я включаю, расположен (JNIUtils.h)

Файл CPP, в котором я пытаюсь создать экземпляр этого объекта, выглядит следующим образом:

#include "stdafx.h"
#include "JNIUtils.h"

using namespace System;

int main(array<System::String ^> ^args)
{
    JNIUtils *util = new JNIUtils();
    Console::WriteLine(L"Hello World");
    return 0;
}

Когда я пытаюсьПри компиляции я получаю следующие ошибки:

Error   3   error LNK1120: 2 unresolved externals   C:\zcarter\UDK\WebSvcClients\Debug\JNITester.exe    JNITester
Error   2   error LNK2019: unresolved external symbol "public: __thiscall JNIUtils::JNIUtils(void)" (??0JNIUtils@@$$FQAE@XZ) referenced in function "int __clrcall main(cli::array<class System::String ^ >^)" (?main@@$$HYMHP$01AP$AAVString@System@@@Z)   C:\zcarter\UDK\WebSvcClients\JNITester\JNITester.obj    JNITester
Error   1   error LNK2028: unresolved token (0A000009) "public: __thiscall JNIUtils::JNIUtils(void)" (??0JNIUtils@@$$FQAE@XZ) referenced in function "int __clrcall main(cli::array<class System::String ^ >^)" (?main@@$$HYMHP$01AP$AAVString@System@@@Z)  C:\zcarter\UDK\WebSvcClients\JNITester\JNITester.obj    JNITester

Может кто-нибудь сказать мне, что я здесь делаю не так?

Ответы [ 2 ]

7 голосов
/ 12 января 2012

Если вы хотите использовать классы из проекта в другой, вам нужно сделать две вещи:

1) Связать скомпилированный код библиотеки (.lib) с вашим основным приложениемcode. Если у вас версия vs2010, просто добавьте проект в раздел Project->Properties->Common->References, вся тяжелая работа будет выполнена за вас.

Если у вас версия vs2008 или ниже, вы должны добавить проект взависимости в Project->Dependencies....Затем перейдите в Project->Properties->Linker->Input и добавьте файл .lib в существующий список .dll.Используйте относительный путь, чтобы он работал на других компьютерах.Обратите внимание, что в vs2008 есть также раздел Reference, но я считаю, что он работает только для сборок CLR.

2) Добавьте заголовки в каталоги включения

Вы уже рассчитывали эту часть, но я рекомендую вам добавить их в Project->Properties->C++->Additional Include Directories, поскольку используемый вами метод не будет работать на другом компьютере, если они не настроены так же, как вы.

1 голос
/ 12 января 2012

ключ к вашей проблеме в том, что вы пытаетесь использовать этот объект в другом проекте .

, чтобы сделать это, вы должны скомпилировать класс в библиотеку классов (я предлагаю статическийодин здесь), а затем связать эту библиотеку в настройках компилятора для второй программы.на самом деле это несколько утомительно, но очень хорошо попробовать!

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

...