Я строю DLL для использования внутри (ForexTester6). Мой DLL работает без spdlog , но не работает, когда я включаю spdlog . Я добавил директиву SPDLOG_COMPILED_LIB Preproccessor в соответствии с некоторой документацией в Интернете и заметил, что spdlog теперь дополняется DLL. Все хорошо и хорошо, но мне нужен Spdlog, чтобы содержать в моем первоначальном DLL. Как я могу достичь этого? Я новичок в spdlog и установил его с помощью vcpkg install spdlog: x86-windows .
Мой упрощенный код:
(ft5holygrail.h)
>>#pragma once
#ifndef FT5HOLYGRAIL_H_
#define FT5HOLYGRAIL_H_
#define NOMINMAX
#include
#include
#include
#include
#include "IndicatorInterfaceUnit.h"
#include "TechnicalFunctions.h"
#include "spdlog/sinks/rotating_file_sink.h"
#include "spdlog/spdlog.h"
#endif
< /code>
(ft5holygrail.cpp)
#ifndef FT5HOLYGRAIL_H_
#include "FT5HolyGrail.h"
#endif
using namespace std::chrono_literals;
TIndexBuffer PivotHighBuffer, PivotLowBuffer;
bool logging_initialised = false;
EXPORT int __stdcall Init()
{
IndicatorShortName("FT6-HolyGrail");
SetOutputWindow(ow_SeparateWindow);
IndicatorBuffers(2);
PivotHighBuffer = CreateIndexBuffer();
SetIndexBuffer(0, PivotHighBuffer);
SetIndexStyle(0, ds_None, psSolid, 1, clRed);
SetIndexLabel(0, "High Target");
PivotLowBuffer = CreateIndexBuffer();
SetIndexBuffer(1, PivotLowBuffer);
SetIndexStyle(1, ds_None, psSolid, 1, clBlue);
SetIndexLabel(1, "Low Target");
if (!logging_initialised)
{
try
{
const std::string log_path = "C:\\ForexTester6\\LOGS\\HolyGrail.log";
const size_t max_file_size = 1024 * 1024 * 5; // 5 MB
const size_t max_files = 3;
auto file_sink = std::make_shared(log_path, max_file_size, max_files);
auto logger = std::make_shared("default", file_sink);
spdlog::register_logger(logger);
spdlog::set_default_logger(logger);
spdlog::set_level(spdlog::level::trace);
// Set the logging pattern.
// [%Y-%m-%d %H:%M:%S.%f] = Timestamp
// [%l] = Log level (e.g., info, debug)
// [%!] = Source function name
// [%v] = The log message
spdlog::set_pattern("[%Y-%m-%d %H:%M:%S.%f] [%l] [%!] %v");
spdlog::flush_on(spdlog::level::trace);
logging_initialised = true;
spdlog::info("Logging system initialized successfully.");
}
catch (const spdlog::spdlog_ex &ex)
{
return -1;
}
}
spdlog::debug("Init() completed.");
return 0;
}
EXPORT void __stdcall Done()
{
spdlog::shutdown();
}
EXPORT void __stdcall OnParamsChange()
{
Done();
Init();
}
EXPORT void __stdcall Calculate(int index)
{
}
< /code>
**** РЕДАКТИРОВАТЬ - Пробуйте разные подходы **** < /p>
Прочитав эту статью, я попытался изменить свой код с новой информацией. Мой код теперь выглядит следующим образом, но все еще не работает.#pragma once
#ifndef FT5HOLYGRAIL_H_
#define FT5HOLYGRAIL_H_
#define NOMINMAX
#include
#include
#include
#include
#include "IndicatorInterfaceUnit.h"
#include "TechnicalFunctions.h"
#include "Log.h"
// #include "spdlog/sinks/rotating_file_sink.h"
// #include "spdlog/spdlog.h"
#endif
< /code>
(ft5holygrail.cpp)
#ifndef FT5HOLYGRAIL_H_
#include "FT5HolyGrail.h"
#endif
using namespace std::chrono_literals;
TIndexBuffer PivotHighBuffer, PivotLowBuffer;
bool logging_initialised = false;
Log m_logger;
EXPORT int __stdcall Init()
{
IndicatorShortName("FT6-HolyGrail");
SetOutputWindow(ow_SeparateWindow);
IndicatorBuffers(2);
PivotHighBuffer = CreateIndexBuffer();
SetIndexBuffer(0, PivotHighBuffer);
SetIndexStyle(0, ds_None, psSolid, 1, clRed);
SetIndexLabel(0, "High Target");
PivotLowBuffer = CreateIndexBuffer();
SetIndexBuffer(1, PivotLowBuffer);
SetIndexStyle(1, ds_None, psSolid, 1, clBlue);
SetIndexLabel(1, "Low Target");
m_logger = Log("default", "C:\\ForexTester6\\LOGS\\default.log");
m_logger.log(Log::Level::debug, "Test!");
// if (!logging_initialised)
// {
// try
// {
// const std::string log_path = "C:\\ForexTester6\\LOGS\\HolyGrail.log";
// const size_t max_file_size = 1024 * 1024 * 5; // 5 MB
// const size_t max_files = 3;
// auto file_sink = std::make_shared(log_path, max_file_size, max_files);
// auto logger = std::make_shared("default", file_sink);
// spdlog::register_logger(logger);
// spdlog::set_default_logger(logger);
// spdlog::set_level(spdlog::level::trace);
// // Set the logging pattern.
// // [%Y-%m-%d %H:%M:%S.%f] = Timestamp
// // [%l] = Log level (e.g., info, debug)
// // [%!] = Source function name
// // [%v] = The log message
// spdlog::set_pattern("[%Y-%m-%d %H:%M:%S.%f] [%l] [%!] %v");
// spdlog::flush_on(spdlog::level::trace);
// logging_initialised = true;
// spdlog::info("Logging system initialized successfully.");
// }
// catch (const spdlog::spdlog_ex &ex)
// {
// return -1;
// }
// }
// spdlog::debug("Init() completed.");
return 0;
}
EXPORT void __stdcall Done()
{
spdlog::shutdown();
}
EXPORT void __stdcall OnParamsChange()
{
Done();
Init();
}
EXPORT void __stdcall Calculate(int index)
{
}
< /code>
(log.h)
#pragma once
#define NOMINMAX
#ifndef LOG_H_
#define LOG_H_
#include
#include
#include
#include
#include
#include
#include
#include
class Log
{
public:
enum class Level
{
info,
warn,
error,
critical,
debug,
trace
};
Log() : Log("default", "C:\\ForexTester6\\LOG\\default.log") {}
Log(const std::string& logger_name, const std::string& filename)
: m_logger_name(logger_name)
{
{
std::lock_guard lock(g_map_mutex);
(void)g_logger_flags[m_logger_name];
}
std::call_once(g_logger_flags.at(m_logger_name), [&]() {
auto file_sink = std::make_shared(filename, 1024 * 1024 * 5, 3);
auto new_logger = std::make_shared(m_logger_name, file_sink);
new_logger->set_level(spdlog::level::trace);
new_logger->flush_on(spdlog::level::trace);
spdlog::register_logger(new_logger);
});
m_logger = spdlog::get(m_logger_name);
}
~Log() = default;
void log(Log::Level level, const std::string& message) {
if (m_logger) {
m_logger->log(to_spdlog_level(level), message);
}
}
void enable_logging() {
enable_logging(Log::Level::info);
}
void enable_logging(Log::Level level) {
if (m_logger) {
m_logger->set_level(to_spdlog_level(level));
}
}
void disable_logging() {
if (m_logger) {
m_logger->set_level(spdlog::level::off);
}
}
bool is_logging_enabled(Log::Level level) {
if (m_logger) {
return m_logger->should_log(to_spdlog_level(level));
}
return false;
}
private:
std::string m_logger_name;
std::shared_ptr m_logger;
static inline std::map g_logger_flags;
static inline std::mutex g_map_mutex;
spdlog::level::level_enum to_spdlog_level(Log::Level level) {
switch (level) {
case Log::Level::info: return spdlog::level::info;
case Log::Level::warn: return spdlog::level::warn;
case Log::Level::error: return spdlog::level::err;
case Log::Level::critical: return spdlog::level::critical;
case Log::Level::debug: return spdlog::level::debug;
case Log::Level::trace: return spdlog::level::trace;
default: return spdlog::level::off;
}
}
};
#endif // LOG_H_
Подробнее здесь: https://stackoverflow.com/questions/797 ... tained-dll
Spdlog в самостоятельном DLL ⇐ C++
Программы на C++. Форум разработчиков
1757322617
Anonymous
Я строю DLL для использования внутри (ForexTester6). Мой DLL работает без [b] spdlog [/b], но не работает, когда я включаю [b] spdlog [/b]. Я добавил директиву SPDLOG_COMPILED_LIB Preproccessor в соответствии с некоторой документацией в Интернете и заметил, что [b] spdlog [/b] теперь дополняется DLL. Все хорошо и хорошо, но мне нужен Spdlog, чтобы содержать в моем первоначальном DLL. Как я могу достичь этого? Я новичок в [b] spdlog [/b] и установил его с помощью vcpkg install spdlog: x86-windows .
Мой упрощенный код:
(ft5holygrail.h)
>>#pragma once
#ifndef FT5HOLYGRAIL_H_
#define FT5HOLYGRAIL_H_
#define NOMINMAX
#include
#include
#include
#include
#include "IndicatorInterfaceUnit.h"
#include "TechnicalFunctions.h"
#include "spdlog/sinks/rotating_file_sink.h"
#include "spdlog/spdlog.h"
#endif
< /code>
(ft5holygrail.cpp)
#ifndef FT5HOLYGRAIL_H_
#include "FT5HolyGrail.h"
#endif
using namespace std::chrono_literals;
TIndexBuffer PivotHighBuffer, PivotLowBuffer;
bool logging_initialised = false;
EXPORT int __stdcall Init()
{
IndicatorShortName("FT6-HolyGrail");
SetOutputWindow(ow_SeparateWindow);
IndicatorBuffers(2);
PivotHighBuffer = CreateIndexBuffer();
SetIndexBuffer(0, PivotHighBuffer);
SetIndexStyle(0, ds_None, psSolid, 1, clRed);
SetIndexLabel(0, "High Target");
PivotLowBuffer = CreateIndexBuffer();
SetIndexBuffer(1, PivotLowBuffer);
SetIndexStyle(1, ds_None, psSolid, 1, clBlue);
SetIndexLabel(1, "Low Target");
if (!logging_initialised)
{
try
{
const std::string log_path = "C:\\ForexTester6\\LOGS\\HolyGrail.log";
const size_t max_file_size = 1024 * 1024 * 5; // 5 MB
const size_t max_files = 3;
auto file_sink = std::make_shared(log_path, max_file_size, max_files);
auto logger = std::make_shared("default", file_sink);
spdlog::register_logger(logger);
spdlog::set_default_logger(logger);
spdlog::set_level(spdlog::level::trace);
// Set the logging pattern.
// [%Y-%m-%d %H:%M:%S.%f] = Timestamp
// [%l] = Log level (e.g., info, debug)
// [%!] = Source function name
// [%v] = The log message
spdlog::set_pattern("[%Y-%m-%d %H:%M:%S.%f] [%l] [%!] %v");
spdlog::flush_on(spdlog::level::trace);
logging_initialised = true;
spdlog::info("Logging system initialized successfully.");
}
catch (const spdlog::spdlog_ex &ex)
{
return -1;
}
}
spdlog::debug("Init() completed.");
return 0;
}
EXPORT void __stdcall Done()
{
spdlog::shutdown();
}
EXPORT void __stdcall OnParamsChange()
{
Done();
Init();
}
EXPORT void __stdcall Calculate(int index)
{
}
< /code>
**** РЕДАКТИРОВАТЬ - Пробуйте разные подходы **** < /p>
Прочитав эту статью, я попытался изменить свой код с новой информацией. Мой код теперь выглядит следующим образом, но все еще не работает.#pragma once
#ifndef FT5HOLYGRAIL_H_
#define FT5HOLYGRAIL_H_
#define NOMINMAX
#include
#include
#include
#include
#include "IndicatorInterfaceUnit.h"
#include "TechnicalFunctions.h"
#include "Log.h"
// #include "spdlog/sinks/rotating_file_sink.h"
// #include "spdlog/spdlog.h"
#endif
< /code>
(ft5holygrail.cpp)
#ifndef FT5HOLYGRAIL_H_
#include "FT5HolyGrail.h"
#endif
using namespace std::chrono_literals;
TIndexBuffer PivotHighBuffer, PivotLowBuffer;
bool logging_initialised = false;
Log m_logger;
EXPORT int __stdcall Init()
{
IndicatorShortName("FT6-HolyGrail");
SetOutputWindow(ow_SeparateWindow);
IndicatorBuffers(2);
PivotHighBuffer = CreateIndexBuffer();
SetIndexBuffer(0, PivotHighBuffer);
SetIndexStyle(0, ds_None, psSolid, 1, clRed);
SetIndexLabel(0, "High Target");
PivotLowBuffer = CreateIndexBuffer();
SetIndexBuffer(1, PivotLowBuffer);
SetIndexStyle(1, ds_None, psSolid, 1, clBlue);
SetIndexLabel(1, "Low Target");
m_logger = Log("default", "C:\\ForexTester6\\LOGS\\default.log");
m_logger.log(Log::Level::debug, "Test!");
// if (!logging_initialised)
// {
// try
// {
// const std::string log_path = "C:\\ForexTester6\\LOGS\\HolyGrail.log";
// const size_t max_file_size = 1024 * 1024 * 5; // 5 MB
// const size_t max_files = 3;
// auto file_sink = std::make_shared(log_path, max_file_size, max_files);
// auto logger = std::make_shared("default", file_sink);
// spdlog::register_logger(logger);
// spdlog::set_default_logger(logger);
// spdlog::set_level(spdlog::level::trace);
// // Set the logging pattern.
// // [%Y-%m-%d %H:%M:%S.%f] = Timestamp
// // [%l] = Log level (e.g., info, debug)
// // [%!] = Source function name
// // [%v] = The log message
// spdlog::set_pattern("[%Y-%m-%d %H:%M:%S.%f] [%l] [%!] %v");
// spdlog::flush_on(spdlog::level::trace);
// logging_initialised = true;
// spdlog::info("Logging system initialized successfully.");
// }
// catch (const spdlog::spdlog_ex &ex)
// {
// return -1;
// }
// }
// spdlog::debug("Init() completed.");
return 0;
}
EXPORT void __stdcall Done()
{
spdlog::shutdown();
}
EXPORT void __stdcall OnParamsChange()
{
Done();
Init();
}
EXPORT void __stdcall Calculate(int index)
{
}
< /code>
(log.h)
#pragma once
#define NOMINMAX
#ifndef LOG_H_
#define LOG_H_
#include
#include
#include
#include
#include
#include
#include
#include
class Log
{
public:
enum class Level
{
info,
warn,
error,
critical,
debug,
trace
};
Log() : Log("default", "C:\\ForexTester6\\LOG\\default.log") {}
Log(const std::string& logger_name, const std::string& filename)
: m_logger_name(logger_name)
{
{
std::lock_guard lock(g_map_mutex);
(void)g_logger_flags[m_logger_name];
}
std::call_once(g_logger_flags.at(m_logger_name), [&]() {
auto file_sink = std::make_shared(filename, 1024 * 1024 * 5, 3);
auto new_logger = std::make_shared(m_logger_name, file_sink);
new_logger->set_level(spdlog::level::trace);
new_logger->flush_on(spdlog::level::trace);
spdlog::register_logger(new_logger);
});
m_logger = spdlog::get(m_logger_name);
}
~Log() = default;
void log(Log::Level level, const std::string& message) {
if (m_logger) {
m_logger->log(to_spdlog_level(level), message);
}
}
void enable_logging() {
enable_logging(Log::Level::info);
}
void enable_logging(Log::Level level) {
if (m_logger) {
m_logger->set_level(to_spdlog_level(level));
}
}
void disable_logging() {
if (m_logger) {
m_logger->set_level(spdlog::level::off);
}
}
bool is_logging_enabled(Log::Level level) {
if (m_logger) {
return m_logger->should_log(to_spdlog_level(level));
}
return false;
}
private:
std::string m_logger_name;
std::shared_ptr m_logger;
static inline std::map g_logger_flags;
static inline std::mutex g_map_mutex;
spdlog::level::level_enum to_spdlog_level(Log::Level level) {
switch (level) {
case Log::Level::info: return spdlog::level::info;
case Log::Level::warn: return spdlog::level::warn;
case Log::Level::error: return spdlog::level::err;
case Log::Level::critical: return spdlog::level::critical;
case Log::Level::debug: return spdlog::level::debug;
case Log::Level::trace: return spdlog::level::trace;
default: return spdlog::level::off;
}
}
};
#endif // LOG_H_
Подробнее здесь: [url]https://stackoverflow.com/questions/79758201/spdlog-within-a-self-contained-dll[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия