Ниже приводится упрощенная версия кода, который я использую с фреймворком Qt:

Foo.h:

// Defines DLL import or export as required
#if defined(REGEXUTIL_LIBRARY)
  #define LIBRARY_EXPORT Q_DECL_EXPORT
#else
  #define LIBRARY_EXPORT Q_DECL_IMPORT
#endif

LIBRARY_EXPORT extern const QString testString;

Foo.cpp :

#include "foo.h"
LIBRARY_EXPORT const QString testString = "Test string";

Test.cpp, в модуле, который импортирует эту DLL:

const QString s = testString;

Я знаю, что как DLL, так и тестовая компиляция и компилируются правильно, поскольку вышеупомянутое работает с неконстантной QString. Однако, когда я делаю QString const, я получаю неразрешенную ошибку внешнего символа при компиляции теста, что, как я предполагаю, связано с тем фактом, что переменная const не инициализирована в файле заголовка. Если я инициализирую его там, я получаю ошибки о том, что префикс импорта DLL не разрешен, когда я пытаюсь скомпилировать тест.

Как правильно исправить эту ошибку? Я хочу иметь доступ к переменным const QString из модулей, которые импортируют эту DLL.

1
x6herbius 21 Дек 2013 в 01:47
Вы пробовали без ключевого слова extern?
 – 
Rob
21 Дек 2013 в 01:55
Если я избавлюсь от extern, тогда ошибки DLL при компиляции с "testString уже определены в foo.obj".
 – 
x6herbius
21 Дек 2013 в 01:59

1 ответ

Лучший ответ

Если решение константной строки, определенной в заголовке, приемлемо для вас, нет необходимости вообще импортировать символ:

//foo.h
static const QString testString = "Test string";

Должно быть достаточно - testString можно получить как в модулях, импортирующих dll, так и внутри самой dll.

-1
Ilya Kobelevskiy 21 Дек 2013 в 02:12
Означает ли это, что было бы несколько ошибок определения, если бы этот заголовок был включен во множество разных файлов?
 – 
x6herbius
21 Дек 2013 в 01:55
Нет, потому что он определен как статический.
 – 
Ilya Kobelevskiy
21 Дек 2013 в 01:56
Упс, не заметил этого. Теоретически должно работать, сейчас просто протестирую.
 – 
x6herbius
21 Дек 2013 в 02:00
Это будет использовать константу во всей программе независимо от того, какое значение эта константа имеет в DLL, которое может быть обновлено без ведома программы. Т.е. в конечном итоге вы получите разные значения в DLL и в программе.
 – 
Ruslan
30 Янв 2021 в 14:29