Компиляция C ++ DLL Visual Studio ошибка связывания с библиотекой CRT - PullRequest
0 голосов
/ 13 февраля 2019

Мне трудно собрать C / C ++ dll в Visual Studio.Кажется, это связано с библиотекой ЭЛТ.

Простой проект VS c ++ dll.Просто удалил перекомпилированный заголовок и добавил / NOENTRY.Методы экспорта работают, но простой класс (не предназначенный для экспорта) вызывает много ошибок связывания с библиотекой CRT:

Test.h:

class ITest
{
public:
    virtual void foo() = 0;
}

class Test final : public ITest
{
public:
    Test();
    ~Test();

    void foo();
};

// extern "C" __declspec(dllexport) ITest* __cdecl CreateTest();

Test.cpp

#include "Test.h"
Test::Test() {}
Test::~Test() {}
Test::foo() {}
// extern "C" __declspec(dllexport) ITest* __cdecl CreateTest() { return new Test; }

ошибки:

Test.obj : error LNK2001: unresolved external symbol _purecall
msvcrt.lib(delete_scalar.obj) : error LNK2019: unresolved external symbol free referenced in function "void __cdecl operator delete(void *)" (??3@YAXPEAX@Z)

Раскомментирование экспорта вызывает больше ошибок ссылки msvcrt.lib и изменение библиотеки времени выполнения для MDd, MT, MTd изменяет только библиотеку, на которую ссылаются.

Спасибо за любую помощь:)

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

/NOENTRY для создания dll, которые вообще не имеют кода и содержат только растровые изображения и т. Д .: https://docs.microsoft.com/en-us/cpp/build/creating-a-resource-only-dll?view=vs-2017

Поскольку у dll (не должно быть) кода, Visual Studio не связывает вбиблиотека времени выполнения, но, поскольку есть код, она создает требования к символам библиотеки времени выполнения, которые не решены.

0 голосов
/ 13 февраля 2019

Проблема связана с параметром / NOENTRY в свойствах проекта-> Linker-> Advanced-> No Entry Point.Устранение проблемы решило проблему

...