Экспорт констант из DLL - PullRequest
       19

Экспорт констант из DLL

1 голос
/ 17 декабря 2010

Я работаю с VC9 в Windows.

У меня есть библиотека (назовем ее libfoo), которая состоит из следующих файлов (директивы include guards и #include пропущены дляради ясности):

// foo.hpp

class Foo
{
  public:
    static const std::string SOME_CONST;
};

И:

// foo.cpp

#include "foo.hpp"

const std::string Foo::SOME_CONST = "hello";

Foo::SOME_CONST экспортируется с использованием файла .def.

Библиотека прекрасно компилируется:* file и libfoo.dll file генерируются.

Я использовал эту библиотеку в примере программы, например:

// main.cpp

#include <foo.hpp>

int main()
{
  std::cout << Foo::SOME_CONST << std::endl; // std::bad_alloc here

  return EXIT_SUCCESS;
}

A std::bad_alloc выбрасывается при каждой попытке использовать Foo::SOME_CONST.

Это происходит только в том случае, если я динамически связываю с libfoo.Связывание статически приводит к прекрасно работающей программе.

Что здесь может происходить?Законно ли таким образом экспортировать std::string константу?

Ответы [ 3 ]

2 голосов
/ 17 декабря 2010

Проверьте, действительно ли dll выполняет динамическую инициализацию, потому что, возможно, стандарт не предъявляет требований к динамическим библиотекам.Обертывание глобалов в статических функциях может быть решением.

1 голос
/ 17 декабря 2010

Связывают ли библиотека и основное приложение с одной и той же версией стандартной библиотеки и / или CRT и / или MFC с одинаковыми настройками?Я видел проблемы с распределением при использовании разных версий CRT, а также боролся с ошибками, вызванными различными настройками отладки итератора между библиотекой и включающим ее приложением.

1 голос
/ 17 декабря 2010

Используйте __declspec (dllexport) и __declspec (dllimport). Перестаньте беспокоиться о файлах .def и обо всем этом, пусть компилятор сделает всю работу.

...