Я пытаюсь получить некоторые функциональные возможности, написанные на C ++, для взаимодействия с Apache ActiveMQ (который изначально использует JMS), расположенный на машине с Linux. Чтобы установить это соединение, я попытался настроить Apache ActiveMQ-CPP на моем компьютере с Windows 7 (компьютере для разработки), но в настоящее время я сталкиваюсь с некоторыми серьезными проблемами.
Насколько я понимаю, ActiveMQ-CPP зависит от Apache Portable Runtime / APR, как указано Вот. Моя проблема в том, что я не могу даже построить APR и, следовательно, не начинаю с ActiveMQ-CPP. Я следовал это руководство буквально, настройка в параллельных каталогах, переименование версий версий в стандартные имена и изменение запуска проекта на libaprutil (с использованием динамических библиотек), но без какой-либо удачи. При построении решения APR успешным является только 13 из 27 проектов. Я также попытался создать решение с использованием статического проекта aprutil в качестве запускаемого проекта, но без каких-либо улучшений.
Решение состоит в том, чтобы обеспечить более широкую совместимость с Visual Studio 6, поэтому я подозреваю, что использование Visual Studio 2010 отвечает за мои проблемы. Несмотря на то, что обновление проекта должно быть возможным (как указано в документации APR), у меня есть несколько (я думаю, что) пропущенных зависимостей в проекте после использования помощника по обновлению и последующей попытки построить полное решение, см. Первый скриншот. Многие из ошибок относятся к файлу iconv_module.obj (error LNK2019: unresolved external symbol xxx referenced in function _iconv_getpath C:\work\apr-iconv\iconv_module.obj
), который, как видно из нижней подсказки, должен быть найден в C:\work\apr-iconv
, Файл фактически находится в разных подпапках, в зависимости от формата сборки (я выбрал «Release» и «Win32»), но я не уверен, является ли это проблемой на самом деле или нет.
Я должен отметить, что я совершенно новичок в C ++ и имею очень ограниченный опыт работы с C, так что, возможно, это просто зависимости, которые я не понимаю, связать вручную … если открыть файл и посмотреть на функции, указанные в однако в сообщениях об ошибках что-то явно не так с кодом, так что, возможно, это не зависимости, см. оба screendumps.
Что касается возможных решений, мне было предложено попробовать создавать каждый проект за раз вручную, а не за одно решение целиком, поэтому библиотеки, не зависящие от чего-либо, создаются в первую очередь и так далее. Это, однако, также не было успешным.
Также должна быть возможность использовать командную строку для построения проекта, что для некоторых людей помогло (ссылка на сайт). «msdev», кажется, заменяется на «devenv» в более новых версиях Visual Studio, но, несмотря на это, сборка все еще жалуется на «msdev not found» после использования find и replace … может быть, не лучшее исправление, а?
При поиске сообщений с похожими проблемами я, конечно, не одинок, но, к сожалению, ни одно из предложенных решений не помогло мне. Некоторые из постов, на которые я смотрел, были: Скомпилируйте Apache APR в Windows а также ActiveMQ-CPP и Visual Studio 2003.
Кто-нибудь из вас имеет опыт создания APR с более новыми версиями Visual Studio или командной строки в Windows? Или, что еще важнее, заставить ActiveMQ-CPP работать в Windows?
Скриншоты:
Мне удалось построить APR через командную строку, используя инструкции в файле README.txt в источнике ActiveMQ.
6.2.1. Библиотека АТР.
APR предоставляется в виде исходного кода только от Apache Software Foundation. Вам нужно будет собрать библиотеку из исходного кода, загрузив последнюю версию с:
http://apr.apache.org/
На момент написания этой статьи последняя версия v1.5.2 была рекомендована, поскольку ее файлы поддержки сборки работают с инструментами Visual Studio 2010.
APR создается из командной строки с использованием предоставленных файлов Make. При сборке библиотеки необходимо убедиться, что вы находитесь в правильной среде для создания требуемых сборок архитектуры (x64 или win32). Вы можете открыть правильную командную строку, используя ярлыки в расположении меню «Пуск» Visual Studio (например, Visual Studio 2010 / Инструменты Visual Studio / Visual Studio x64 win 64 Командная строка
Как только вы попали в соответствующую командную строку, перейдите в каталог, в котором находится исходный код APR (например, C: \ APR), а затем запустите сборку для библиотеки, чтобы получить желаемую сборку ARCH.
Для 32-битной библиотеки, которая устанавливается в соответствующий каталог дистрибутива, запустите:
nmake -f Makefile.win ARCH="Win32 Release" PREFIX=C:\dist\APR\x64 buildall install clean
и для 64-битной сборки библиотеки используйте команду.
nmake -f Makefile.win ARCH="x64 Release" PREFIX=C:\dist\APR\x64 buildall install clean
Я сделал:
Идти к: Пуск> Все программы> Visual Studio 2017> Инструменты Visual Studio
и запустить Командная строка разработчика. Перейдите оттуда к местоположению вашего источника APR и выполните соответствующую команду. На 64-битной Windows 7 я запускал nmake -f Makefile.win ARCH="Win32 Release" PREFIX=C:\dist\APR\x64 buildall install clean
Более общий:
Идти к: Меню Пуск> Все программы> Visual Studio 2017> Инструменты Visual Studio> VC и запустите командную строку архитектуры, для которой вы строите. Затем продолжите вышеуказанные шаги, используя nmake -f Makefile.win ARCH="x64 Release" PREFIX=C:\dist\APR\x64 buildall install clean
если строить для архитектуры x64.
Это успешно построено APR и положить его в C:\dist\APR\x64
Затем в Visual Studio убедитесь, что C:\dist\APR\x64\includes
связан в Дополнительные Включения в свойствах проекта.
Построение в этой точке приводит к следующим ошибкам (решение см. Ниже):
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(53): error C2039: 'auto_ptr': is not a member of 'std'
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\include\sstream(13): note: see declaration of 'std'
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(53): error C2143: syntax error: missing ';' before '<'
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(53): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(53): error C2238: unexpected token(s) preceding ';'
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(55): error C2614: 'decaf::internal::security::SRNGData': illegal member initialization: 'random' is not a base or member
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(74): error C2039: 'random': is not a member of 'decaf::internal::security::SRNGData'
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(45): note: see declaration of 'decaf::internal::security::SRNGData'
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(74): error C2228: left of '.reset' must have class/struct/union
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(96): error C2039: 'random': is not a member of 'decaf::internal::security::SRNGData'
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(45): note: see declaration of 'decaf::internal::security::SRNGData'
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(96): error C2228: left of '.get' must have class/struct/union
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(99): error C2039: 'random': is not a member of 'decaf::internal::security::SRNGData'
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(45): note: see declaration of 'decaf::internal::security::SRNGData'
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(99): error C2227: left of '->setSeed' must point to class/struct/union/generic type
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(117): error C2039: 'random': is not a member of 'decaf::internal::security::SRNGData'
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(45): note: see declaration of 'decaf::internal::security::SRNGData'
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(117): error C2228: left of '.get' must have class/struct/union
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(140): error C2039: 'random': is not a member of 'decaf::internal::security::SRNGData'
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(45): note: see declaration of 'decaf::internal::security::SRNGData'
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(140): error C2227: left of '->nextBytes' must point to class/struct/union/generic type
Для устранения ошибок отредактируйте activemq-cpp-library-3.9.4\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp
добавляя #include <memory>
в верхней части файла.
Восстановление после добавления вышеупомянутых результатов приводит к успешной сборке ActiveMQ.
Вывод на: activemq-cpp-library-3.9.4\vs2010-build\\Win32\Release\libactivemq-cpp.lib
Я построил ActiveMQ на Visual Studio 2012 pro с помощью APR, который доступен в репозитории NuGet. В моем случае некоторые конфигурации не удается связать. Простое исправление пути в разделе Ссылка свойств проекта заставит его работать.
Мне не удалось запустить модульный тест.