Spdlog в самостоятельном DLLC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Spdlog в самостоятельном DLL

Сообщение Anonymous »

Я строю 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»