Можем ли мы экспортировать функцию, доступную через статическую библиотеку - PullRequest
2 голосов
/ 08 марта 2012

У меня есть статическая библиотека, скажем " A.lib ", которая содержит функцию int foo().У меня есть другая DLL, скажем " B.dll ", которая потребляет A.lib и использует функцию foo(), а также экспортирует некоторые другие функции.Можно ли экспортировать функцию int foo() (импортированную из A.lib) из B.dll, чтобы ее можно было использовать в третьей DLL, скажем " C.dll ".

Я хочу знать, возможно ли это или нет, я не хочу обходных путей, например, сделав A.lib доступным для C.dll .Кроме того, меня не беспокоит плохой дизайн или нет.

Большое спасибо за ваше терпение, прочитав это до конца.

Ответы [ 2 ]

0 голосов
/ 17 августа 2017

У меня было такое же требование - только что нашел другое решение:

Предполагая, что A.lib имеет Ah (который используется исходными файлами, используемыми для сборки B.dll, например, предполагая, что Ah содержит прототипы для функцийсодержится в A.lib), просто добавьте в Ah следующее:

#pragma comment(linker, "/export:_foo")

Это даст указание компоновщику экспортировать foo() при сборке B.dll.Обратите внимание на начальное подчеркивание - оно там, потому что это истинное имя символа для foo(), содержащегося в A.lib (используйте dumpbin /symbols A.lib | findstr foo, чтобы увидеть его).В моем примере foo() использовал соглашение о вызовах __cdecl, но если вы используете __stdcall() или компилируете как C ++, вы получите другое оформление имени, поэтому вам придется настроить приведенный выше оператор #pragma какрезультат.

Неважно, будет ли Ah включен многими исходными файлами в B.dll - компоновщик не будет жаловаться, если одно и то же определение будет сделано несколько раз.

One "Преимущество этого подхода в том, что вам даже не нужно использовать спецификатор __declspec(dllexport) для foo() в A.lib ...

0 голосов
/ 08 марта 2012

Да, это возможно, но любой пример кода зависит от языка.(например, в C вы можете просто экспортировать функцию с тем же именем, и C.dll увидит ее)

...