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

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

22.07.2024, 20:19. Показов 6851. Ответов 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. Но вызывать конструктор я ещё не мог, это приводило к ошибке

Code Скопировано
1
2
3
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 библиотеку проект не собирается, с ошибкой:

Code Скопировано
1
2
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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.07.2024, 20:19
Ответы с готовыми решениями:

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

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

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

2
617 / 513 / 104
Регистрация: 05.08.2022
Сообщений: 2,775
23.07.2024, 07:41
Цитата Сообщение от 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Эксперт С++
 Аватар для TheCalligrapher
12873 / 6737 / 1810
Регистрация: 18.10.2014
Сообщений: 17,057
23.07.2024, 08:33
Цитата Сообщение от finaleprog Посмотреть сообщение
Как сделать так, чтобы во время линковки или запуска cpp-db-test искался не cpp-db.lib а cpp-db.dll?
Никак, ибо это неправильно.

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

Если у вас проставлена Reference на проект библиотеки, все должно получаться само собой.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.07.2024, 08:33
Помогаю со студенческими работами здесь

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

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

getServletContext().setAttribute использование внутри больше одного класса
Добрый день! Тренируюсь по курсу https://netbeans.org/kb/docs/javaee/ecommerce/entity-session_ru.html создавать веб приложения на...

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

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Работа с объемным DOM в javascript
Htext 04.04.2025
Сегодня прочитал статью тут о расходах памяти в JS, ее утечках и т. п. И вот что вспомнил из своей недавней практики. Может, кому пригодится. Хотя, в той статье об этом тоже есть. Дело в том, что я. . .
Оптимизация производительности Node.js с помощью кластеризации
run.dev 04.04.2025
Масштабирование приложений для обработки тысяч и миллионов запросов — обыденная задача для многих команд. Node. js, благодаря своей асинхронной событийно-ориентированной архитектуре, стал популярной. . .
Управление зависимостями в Python с Poetry
py-thonny 04.04.2025
Стандартный инструмент для установки пакетов в Python - pip - прекрасно справляется с базовыми сценариями: установил пакет командой pip install и используешь его. Но что произойдёт, когда разные. . .
Мониторинг с Prometheus в PHP
Jason-Webb 04.04.2025
Prometheus выделяется среди других систем мониторинга своим подходом к сбору и хранению метрик. В отличие от New Relic, который использует агентный подход и отправляет данные во внешнее хранилище,. . .
Пакет Context в Golang: Управление потоками и ресурсами
golander 04.04.2025
Работа с горутинами в Go часто напоминает управление непослушными детьми - они разбегаются кто куда, делают что хотят и не всегда завершаются вовремя. К счастью, в Go 1. 7 появился пакет context,. . .
Контейнеризация React приложений с Docker
Reangularity 03.04.2025
Контейнеризация позволяет упаковать приложение со всеми его зависимостями в автономный контейнер, который можно запустить на любой платформе с установленным Docker. Это существенно упрощает процессы. . .
Свой попап в SwiftUI
mobDevWorks 03.04.2025
SwiftUI, как декларативный фреймворк от Apple, предоставляет множество инструментов для создания пользовательских интерфейсов. В нашем распоряжении есть такие API как alerts, popovers, action sheets. . .
Антипаттерны микросервисной архитектуры
ArchitectMsa 03.04.2025
Хорошо спроектированная микросервисная система может выдержать испытание временем, оставаясь гибкой, масштабируемой и устойчивой к большинству проблем. Такая архитектура обладает высоким уровнем. . .
std::mutex в C++: Советы и примеры использования
bytestream 03.04.2025
std::mutex - это механизм взаимного исключения, который гарантирует, что критический участок кода выполняется только одним потоком в каждый момент времени. Это простое, но могущественное средство. . .
Не удержался от оценки концепции двигателя Стирлинга.
Hrethgir 03.04.2025
Сколько не пытался - она выдавала правильные схемы, причём случайно рисовала горячие области в середине, холодные по краям, трубки с краёв в низ и магнит в соединяющей, но при этой выдавала описание. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер