Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
1 / 1 / 0
Регистрация: 22.07.2024
Сообщений: 3
1

Использование одного проекта другим внутри одного солюшена

22.07.2024, 20:19. Показов 3151. Ответов 2

Author24 — интернет-сервис помощи студентам
После долгих лет программирования на Java решил попробовать современный C++ и для этого установил последнюю версию Microsoft Visual Studio Community 2022 с MSVC.

В солюшене создал два проекта - cpp-db и cpp-db-test. Первый проект - это простая заготовка статической .lib библиотеки, которая пока ничего полезного не делает. А второй проект - это простенькое консольное приложение, которое печатает приветствие и вызывает конструктор класса из cpp-db библиотеки. Конструктор тоже лишь выводит приветствие.

В начале возникла проблема, как познакомить первый проект со вторым. Это оказалось не столь простой задачей, как в Java + Maven. С этого места прошу комментировать мои действия и сообщать что я сделал не так или как было бы лучше сделать.

Вначале, через правый клик, я пометил второй проект как "Set as Startup Project". После этого название/директория проекта в Solution Explorer стало выделяться жирным шрифтом. Это позволило его запускать через Ctrl+F5, пока ещё без обращения ко второму проекту.

Затем я добавил директорию первого проекта в Additional Include Directories второго проекта как $(SolutionDir)cpp-db Это позволило использовать #include "database.h" в main.cpp проекта cpp-db-test. Но вызывать конструктор я ещё не мог, это приводило к ошибке

Код
Severity	Code	Description	Project	File	Line	Suppression State	Details
Error	LNK2019	unresolved external symbol "public: __cdecl Database::Database(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (??0Database@@QEAA@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) referenced in function main	cpp-db-test	D:\develop\cpp-db\cpp-db-test\main.obj	1		
Error	LNK1120	1 unresolved externals	cpp-db-test	D:\develop\cpp-db\x64\Debug\cpp-db-test.exe	1
Решением этой проблемы стало добавление cpp-db в список References второго cpp-db-test проекта. В этом случае солюшен собирается и проект cpp-db-test корректно работает, выводя на экран два приветствие: своё и конструктора класса из первого проекта.

Если я меняю тип первого проета со статической .lib библиотеки на динамическую .dll библиотеку проект не собирается, с ошибкой:

Код
Severity	Code	Description	Project	File	Line	Suppression State	Details
Error	LNK1104	cannot open file 'D:\develop\cpp-db\x64\Debug\cpp-db.lib'	cpp-db-test	D:\develop\cpp-db\cpp-db-test\LINK	1
Как сделать так, чтобы во время линковки или запуска cpp-db-test искался не cpp-db.lib а cpp-db.dll? Сам этот dll создаётся.

Как сделать всё то же самое при помощи CMake? Или какой другой системой сборки, совместимой с MSVC, вы бы воспользовались? Будет ли такое решение (CMake или другое) работать не только в MSVC, а допустим ещё и в MINGW64 с GCC?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.07.2024, 20:19
Ответы с готовыми решениями:

Использование команд одного класса другим классом
Господа помогите разобраться. Есть класс Line, а есть класс Point. Лайн строится на двух поинтах....

Как сделать так, что при совпадении одного объекта с другим происходило удаление одного из них
Подскажите, как сделать так, что при совпадении одного объекта с другим происходило удаление одного...

Можно ли из одного проекта управлять другим проектом?
Можно ли из одного проекта управлять другим проектом? Редактировать формы, писать новый код? если...

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

Как копировать модуль и форму внутри одного проекта
Как копировать модуль и форму внутри одного проекта в VBA?

2
567 / 469 / 99
Регистрация: 05.08.2022
Сообщений: 2,563
23.07.2024, 07:41 2
Цитата Сообщение от finaleprog Посмотреть сообщение
Как сделать так, чтобы во время линковки или запуска cpp-db-test искался не cpp-db.lib а cpp-db.dll? Сам этот dll создаётся.
Для линковки проекта cpp-db-test нужна именно cpp-db.lib (это специальньная lib с экспротируемыми из dll функциями). И она явно создается, раз dll собирается. Надо найти где эта lib создается и проекту cpp-db-test прописать путь до этой lib в настройке VC++ Directories --> Library Directories

Однако, чтобы можно было вызывать функции/методы из DLL их надо экспротировать из DLL.
Для просто функций экспорт понятно как делать (гуглить по "как экспортировать функции из DLL", я на память не помню все моменты)
А вот как заэкспротировать из DLL методы класса, конструктор.... хм, чета не делал такого.
Но явно можно нагуглить как это делать по фразе на предыдущей строке или просто "C++ как создать класс из DLL"
0
Вездепух
Эксперт CЭксперт С++
12768 / 6650 / 1790
Регистрация: 18.10.2014
Сообщений: 16,809
23.07.2024, 08:33 3
Цитата Сообщение от finaleprog Посмотреть сообщение
Как сделать так, чтобы во время линковки или запуска cpp-db-test искался не cpp-db.lib а cpp-db.dll?
Никак, ибо это неправильно.

Нет, искаться должен именно .lib. Даже когда вы компилируете .dll, рядом с ней все равно должен создаваться маленький промежуточный .lib - библиотека импорта. И линковать вы будете все равно именно этот .lib.

Если у вас проставлена Reference на проект библиотеки, все должно получаться само собой.
0
23.07.2024, 08:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.07.2024, 08:33
Помогаю со студенческими работами здесь

getServletContext().setAttribute использование внутри больше одного класса
Добрый день! Тренируюсь по курсу...

как сделать ссылку из страницы одного проекта на страницу другого проекта?
Добрый день! Подскажите пожалуйста, у меня есть Solution, в нем проект на WebForms и проект Dinamic...

Как вставить User Control из одного проекта в Frame главного проекта?
Такая ситуация есть решение. В нем 2 проекта. В первом есть окно (WPF) в котором реализован контрол...

Как импортировать пакет одного проекта в классах другого проекта
Здравствуйте, совсем недавно начал изучать Java, такой вопрос: работаю в иде Eclipse, как мне...

Приоритеты одного на другим?
Здравствуйте. Есть такая проблема при редактировании и/или создание нового предмета в расписании,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru