Да, компоновщик запускается, чтобы завершить сборку DLL, и для сборки потребуется определение foo
. Но если вы не связываете одну и ту же библиотеку кода, содержащую my_program::foo
, с my_dll.dll
, то foo
, выбранный для связывания самой DLL, будет my_dll::foo
.
Единственный случай, когда у вас могут возникнуть проблемы, - это если у вас есть библиотека статических кодов shared.lib
, которая реализует независимую функцию foo
и связана как с EXE, так и с DLL. Может быть неоднозначно, какую библиотеку DLL подхватит, если она имеет локальную реализацию foo
.