Когда вы пишете код в заголовке, он работает, потому что вызов встроен, и поэтому он никогда не идет в DLL для его поиска.
Вы можете проверить, импортируется / экспортируется ли тестовая функция, с помощью необходимой утилиты: Зависимость Уокер .
В любом случае, вы передаете std::vector
с копией в DLL. Таким образом, необходимо, чтобы DLL и EXE компилировались и связывались с использованием точно одинаковых заголовков C ++, библиотек, версии компилятора и параметров компилятора.
Если вы не будете следовать этому правилу, например, DLL отлажена, а EXE выпущен, тогда вы получите очень странные эффекты: случайные повреждения, сбои и т. Д.
Если вам нужно смешивать библиотеки DLL и EXE, скомпилированные по-разному, то интерфейс должен быть строго ограничен (обычный C без кросс-динамической памяти).