Как управлять экспортируемыми символами при написании библиотеки stati c в Visual Studio? - PullRequest
0 голосов
/ 30 марта 2020

Я хочу создать библиотеку stati c, в которой есть некоторые функции / переменные / et c. экспортируется, а другие используются внутри библиотеки. Все экспортируется в C -стиле.

Как этого добиться?

Я попробовал следующее:


MyLib.h

int Test(int a, int b);

MyLib. cpp

#include "MyLib.h"
int Private(int a, int b)
{
    return a * b;
}
int Test(int a, int b)
{
    return Private(a, b);
}

И вот как я использую библиотеку:

Main. cpp

#include "MyLib.h"
int main()
{
    int x = Test(4, 6);
    ...
}

Все это, кажется, работает хорошо.

Однако я считаю, что функция Private также экспортируется.

Таким образом, следующий код также скомпилирует и скомпонует:

Main. cpp

#include "MyLib.h"
int Private(int a, int b);
int main()
{
    int x = Private(4, 6);
    ...
}

Поэтому, я предполагаю, что я загрязнил глобальное пространство имен, и теперь я не могу определить функцию с именем Private в Main.cpp, потому что компоновщик будет жаловаться, что этот символ уже существует.


Так как мне контролировать, какие функции / переменные / символы видны для кодов, которые используют библиотеку?

После выполнения поиска я обнаружил, что объявление * Функция 1037 * в MyLib.cpp как static, кажется, решает проблему. Однако я не уверен, что это лучший способ. Для меня было бы более целесообразно «пометить» те, которые я хочу экспортировать, а не «пометить» те, которые я хочу скрыть, поскольку я хочу экспортировать только небольшую часть всех символов.

1 Ответ

0 голосов
/ 30 марта 2020

Упрощенная версия:

ОС не распознает stati c libs как нечто, что она понимает. Он имеет дело только с файлами exe, dll и data. Вы создаете stati c lib, чтобы объединить его в 1 или более exe и | или dll, в основном, чтобы сохранить перекомпиляцию для каждого.

Таким образом, ожидается, что вы захотите иметь доступ ко всем код | данные в stati c lib при сборке exe или dll, с которым вы связали его.

В отличие от exe | dll может быть применена защита ОС, и он считается ' конечный продукт », поэтому по умолчанию все является закрытым, если явно не помечено как экспортированное.

Итак, либо:

  • используйте stati c lib и поместите все 'private вещи "в. cpp, например, помеченные как stati c, как вы обнаружили, или в анонимном пространстве имен, или ...

  • используйте dll и отметьте все" publi c stuff 'как экспортировано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...