Как искать определения функций / классов локально, прежде чем искать подключенные библиотеки? (Линкер С ++) - PullRequest
0 голосов
/ 17 января 2019

Мое наблюдение: 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) меньший приоритет, чтобы компоновщик сначала рассматривал локально существующие определения, а не смотрел в другое место». Это очень элегантно решает проблему.

...