Stati c ошибка ссылки на переменную в MSV C, даже если она создана в файле cpp - PullRequest
0 голосов
/ 02 мая 2020

Я работаю над кроссплатформенной (Linux & Windows) библиотекой. У одного из моих классов есть член stati c, определенный в заголовке. И я создал его в файле CPP, например

namespace raisim {
std::function<void()> RaiSimMsg::fatalCallback_ = []() { exit(1); };
}

Файл заголовка

#ifndef RAISIM_MESSAGE_LOGGER_HPP
#define RAISIM_MESSAGE_LOGGER_HPP

#include <chrono>
...

namespace raisim {

class RaiSimMsg {
 public:
  ...
  void stream(const char *file, const int line, std::stringstream &msg, int severity) {
    if (severity == RSEVERITY_FATAL)
      fatalCallback_();
  }


 private:
   static std::function<void()> fatalCallback_;
};


}

#endif //RAISIM_MESSAGE_LOGGER_HPP

Это прекрасно работает с G CC и Clang в Linux. Но MSV C выдает ошибку ссылки. Есть ли у MSV C свои собственные правила для пользователей stati c ??

Полный журнал ошибок

1>anymal.obj : error LNK2001: unresolved external symbol "private: static class std::function<void __cdecl(void)> raisim::RaiSimMsg::fatalCallback_" (?fatalCallback_@RaiSimMsg@raisim@@0V?$function@$$A6AXXZ@std@@A)
1>C:\Users\ultrafrog\source\repos\raisim\build\benchmark\Debug\speed_test_anymal.exe : fatal error LNK1120: 1 unresolved externals
1>Done building project "speed_test_anymal.vcxproj" -- FAILED.

1 Ответ

0 голосов
/ 03 мая 2020

Ответ Джека Динглера здесь

https://www.codeproject.com/Questions/585271/Aplusstaticplusmemberplusvariableplusexportpluserr

сработало. Таким образом, проблема заключается в том, что компоновщик Windows должен знать, нужно ли импортировать или экспортировать символ. Поэтому мы должны объявить __declspec(dllexport) при экспорте (при создании библиотеки) и __declspec(dllimport) для ее использования. Мы можем изменить это, используя флаг компиляции. Я не уверен, почему они разработали такой компоновщик, но в любом случае он теперь работает.

...