Alain Leglise Ответов: 1

Скомпилировать статическую библиотеку с помощью CString


Всем привет.

Я пытаюсь скомпилировать консольную программу, использующую статическую библиотеку, реализующую CString.

Я работаю с Visual Studio 2012 в Windows 10.

Вот код :

Файл TestLib.h
#pragma once
#include <atlstr.h>

class TestLib
{
public:
	TestLib(){};
	TestLib(const CString &tst);
	virtual ~TestLib(void);
private:
	CString _tst;
};


Файл TestLib.cpp
#include "stdafx.h"
#include "TestLib.h"


TestLib::TestLib(const CString &tst)
	: _tst(tst)
{
}


TestLib::~TestLib(void)
{
}


Файл

// ConsoleTest2.cpp : définit le point d'entrée pour l'application console.
//

#include "stdafx.h"
#include "TestLib.h"

int _tmain(int argc, _TCHAR* argv[])
{

	TestLib *tst = new TestLib(); // This compile fine !
	//TestLib *tst = new TestLib(_T("Test")); // This generates LNK2019 link error
	return 0;
}


Консольное приложение было создано с помощью мастера VS с помощью :

Консольное приложение Win32 с предварительно скомпилированными заголовками, проверкой SDL, но без ATL или MFC.
Статическая библиотека - это статическая библиотека MFC (Wizard construction).

Где (где) моя ошибка(ошибки) ?

Что я уже пробовал:

Я создал новое консольное приложение с помощью элементов управления MFC - это прекрасно компилируется со статической библиотекой.

Затем я контролировал и изменял при необходимости все параметры ссылок, сравнивая 2 консольных проекта.
Но 1-е консольное приложение не компилируется.
Я в тупике !

1 Ответов

Рейтинг:
6

Jochen Arndt

Было бы неплохо увидеть полное сообщение об ошибке, чтобы увидеть, какие функции отсутствуют.

Если вы создаете свое приложение без поддержки MFC, оно не связано с библиотекой, содержащей CString вспомогательная функция. Потому что вы в том числе atlstr.ч, вы не получаете ошибок компиляции. Но в очереди

TestLib *tst = new TestLib(_T("Test"));
вы создаете временное CString а конструктор вызывает функции из библиотеки MFC, что приводит к ошибке компоновщика.

Самым простым решением было бы изменить второй конструктор вашей библиотеки на
TestLib::TestLib(LPCTSTR str)
	: _tst(str)
{
}
Затем ваше консольное приложение передает TCHAR* указатель вместо создания temporaray CString и это задание выполняется в вашей библиотеке, которая связана с библиотекой MFC.


Alain Leglise

Чтобы ответить на вашу первую цель, вот полное сообщение об ошибке (извините по-французски, но важна функция)

Erreur 1 ошибку lnk2019: символы внешние номера résolu "общественности: __thiscall Сазанка::Сазанка(АТЛ класса в::cstringt И&Л;тип wchar_t,класс ATL::StrTraitATL&ЛТ;тип wchar_t,класс ATL::ChTraitsCRT&ЛТ;тип wchar_t&ГТ; &ГТ; &ГТ; строительства &усилителя;)" (??0TestLib@@ка@АБВ?$Класса cstringt@_WV?$StrTraitATL@_WV?$ChTraitsCRT@_W@АТЛ@@@АТЛ@@@АТЛ@@@Z) в référencé данс Ла обивкой _wmain C:\Users\Alain\Documents\Visual студия 2012\проекты\CStringLibraryTest\ConsoleTest2\ConsoleTest2.параметр obj ConsoleTest2

Jochen Arndt

Большая часть материала CString встроена, но ошибка показывает, что символы ATL::StrTraitATL и ATL::ChTraitsCRT не могут быть найдены.

Спасибо, что приняли мое решение.

Alain Leglise

До сих пор это был лучший выстрел, который я когда-либо находил :)
Спасибо тебе!