2016-10-11 6 views
1

Что произойдет, если исполняемая и разделяемая библиотека содержат функции с тем же именем? Например EXE имеет определение, как это:Может ли исполняемая и совместно используемая библиотека содержать функции с тем же именем?

extern int fund() 
{ 
    return 0; 
} 

и разделяемая библиотека имеет такое же определение:

extern int fund() 
{ 
    return 1; 
} 

какая функция будет вызываться из исполняемого файла и из общей библиотеки: 1 - для Windows? 2 - для unix-base?

PS: Когда я определяю AfxWinMain в своем приложении MFC, при запуске он будет вызываться вместо AfxWinMain в MFC DLL. Мне нужна теория, почему так?

+1

Ответ для этого отличается от C, пожалуйста, не спам-теги. – George

+0

@George: Вы уверены? Технически это зависит от компилятора, но все, что я знаю, решит «фонд» на символ, определенный в этом модуле. – MSalters

+0

@Mikhail Kipa: Подумайте, что произойдет, если Windows X + 1 добавит новую функцию в DLL Windows, которая случайно столкнулась с функцией с тем же именем в вашем исполняемом файле. – MSalters

ответ

1

Вы уже ответили на вопрос в заголовке.

Зависимости, не связанные с общей библиотекой, разрешаются во время связи, а не во время загрузки. Как только компоновщик удовлетворит эту внешнюю ссылку на статическую библиотеку, она останется такой, и ни Windows, ни загрузчик Unix больше не попытаются ее решить (символ обычно не отображается даже в двоичном виде после этапа ссылки) ,

При связывании с библиотеками (независимо от статического или динамического) компоновщик прекращает поиск символа для разрешения, как только он найдет ссылку, которая удовлетворяет этому требованию и не будет выглядеть дальше ни в каком другом (или таком же) для этого символа. Вот почему вы можете предоставить несколько определений для одной и той же функции в библиотеках (в отличие от объектных файлов, которые гарантированно будут изучены исчерпывающе и, таким образом, будут проверяться на наличие дубликатов символов).

Только символы, которые необходимо разрешить при загрузке, обозначаются как «внешние общие» и разрешаются загрузчиком во время выполнения.

Я не вижу принципиальной разницы в этом отношении между ОС Unixoid и Windows.