Мое наблюдение: C ++ Linker (в частности, Visual Studio) слишком серьезно относится к __declspec (dllimport), компоновщик ищет определения
любого класса / функции, объявленной с помощью этой директивы, ТОЛЬКО в прикрепленных библиотеках. (Игнорирование определений, представленных локально).
Я хочу дать директиве __declspec (dllimport) меньший приоритет, чтобы компоновщик сначала рассматривал локально присутствующие определения, прежде чем искать в другом месте. Возможно ли это сделать?
Также это специфично для Windows / Visual Studio? если так, есть ли обходной путь?
Я столкнулся с этой проблемой при попытке использовать предварительно скомпилированные двоичные файлы MathGL-v2.4.2 в Visual Studio 2015, Windows.
Начальные сборки дали много ошибок компоновщика 2019: неразрешенный внешний символ __declspec (dllimport) _cdel mglGraph :: mglGraph (void) .... бла-бла.
Далее, я просмотрел код библиотеки и обнаружил, что определения каждого класса и структуры имеют вид:
class MGL_EXPORT mglGraph {
// some variables and
// Full function definitions
// (also contains some inline functions)
};
Где MGL_EXPORT определяется как,
/* in dllexport.h the following is declared */
# ifdef mgl_EXPORTS
/* We are building this library */
# define MGL_EXPORT __declspec(dllexport)
# else
/* We are using this library */
# define MGL_EXPORT __declspec(dllimport)
# endif
Кроме того, я посмотрел экспортированные символы libmgl.dll, тех символов, которые ищет компоновщик, не существует (следовательно, естественно, компоновщик выдает неразрешенную ошибку символов).
Из всего вышесказанного, Заключение: компоновщик игнорирует любое локальное определение класса / функции и ищет только присоединенные библиотеки для определений функций, класса / функции, объявленной с директивой __declspec (dllimport).
Еще одно доказательство: удаляя MGL_EXPORT из определения полностью определенных функций / классов, код компилируется
Теперь вопрос: это специфическая проблема платформы? если да, есть ли обходной путь? (так как очень трудно тщательно просмотреть каждый класс в библиотеке, чтобы убедиться, что все функции полностью определены перед удалением директивы MGL_EXPORT).
«Я хочу дать директиве __declspec (dllimport) меньший приоритет, чтобы компоновщик сначала рассматривал локально существующие определения, а не смотрел в другое место». Это очень элегантно решает проблему.