Как использовать глобальную переменную const, определенную в DLL - PullRequest
0 голосов
/ 04 мая 2019

У меня есть следующий файл common / const.h :

#ifndef COMMON_CONST_H
#define COMMON_CONST_H

#if defined _WIN32 || defined _WIN64
#ifdef PCOM_EXPORTS
#define PCOM_WINAPI __declspec(dllexport)
#else
#define PCOM_WINAPI __declspec(dllimport)
#endif // PCOM_EXPORTS
#endif // _WIN32

namespace common {

extern PCOM_WINAPI const char DIR_SEPARATOR;

}

#endif /* COMMON_CONST_H */

И common / const.cpp :

#include "common/const.h"

namespace common {

#if defined _WIN32 || defined _WIN64
const char DIR_SEPARATOR = '\\';
#else
const char DIR_SEPARATOR = '/';
#endif

}

Я генерирую свой DLL файл без проблем.Но когда я хочу использовать эту переменную DIR_SEPARATOR из другой библиотеки, я получаю:

Util.obj: ошибка LNK2001: неразрешенный внешний символ "char const common :: DIR_SEPARATOR": fatalошибка LNK1120: 1 неразрешенный внешний код

Util.cpp (клиент DLL) код:

#include "common/const.h"
...
namespace db {
...
shared_ptr<iptree> Util::loadIniFile(const string& filePath) {
  string file = filePath;
  replace(file.begin(), file.end(), '/', prompt::common::DIR_SEPARATOR);
  shared_ptr<iptree> tree(new iptree);
  ...
}

}

Мои вопросы:

  • Почему я получаю неразрешенный внешний символ "char const common :: DIR_SEPARATOR" если я включаю common / const.h (namespace common { extern PCOM_WINAPI const char DIR_SEPARATOR; }) в Util.cpp?
  • Всеэтот код отлично работает в Linux (.so генерируется и используется клиентом).Почему я получаю эти ошибки при портировании на Windows?Visual Studio 2017 по умолчанию использует C ++ 14.В Linux я использую C ++ 11.Проект Dll и проект клиента имеют одинаковые конфигурации.Так что я почти уверен, что проблем здесь нет.
  • Что мне нужно сделать, чтобы заставить работать этот код?

Я хотел бы установить DIR_SEPARATOR значение только один раз.Возможно ли это в этом случае?Я что-то упустил?

Заранее спасибо.

...