Динамическое связывание с указанием директории
Пытаясь в кросс-компиляцию: При запуске приложения с помощью wine, скомпилированного i686-w64-mingw32-g++, заметил, что приложение ищет .dll в той же директории, где находится. Пример:
user@workstation:~/.../tmp$ i686-w64-mingw32-g++ -o MyWin.exe main.cpp
user@workstation:~/.../tmp$ wine MyWin.exe 0009:err:module:import_dll Library libstdc++-6.dll (which is needed by L"Z:\\...\\tmp\\MyWin.exe") not found 0009:err:module:LdrInitializeThunk Importing dlls for L"Z:\\...\tmp\\MyWin.exe" failed, status c0000135 .
Само собой, если докинуть в директорию с .exe нужные .dll, то оно заработает. Вопрос: есть ли возможность/способ как то указывать директорию с .dll при компиляции/запуске? Cmake приветствуется. Хотелось бы компилироваться под linux и готовый бинарник просто запускать на win.
Ответы (1 шт):
Есть два способа использовать длл - в одном случае Вы сами пишете код LoadLibrary и загружаете dll по любому желаемому пути, второй способ - отдать это на откуп линковщика и загрузчика PE файлов операционной системы.
С первым способом понятно - сами указываете путь к dll как Вам хочется. И CMake тут никак не поможет. Ну разве что через него передавать путь в код - сгенерировать header. Но это такое. Странное решение.
С вторым способ из приложения никак нельзя влиять. Потому что на тот момент, когда ищутся dll, само приложение только "копируется" в память, но ещё не запущено. И операционная система сама ищет по известным ей путям.
Но можно сделать батничек для запуска (так часто и делают). И написать там где то такое
set PATH=C:\путь\к\длл\;%PATH%
your.exe
и готово. И опять, тут cmake снова никак не поможет, ну разве что bat сгенерирует, но его легче ручками написать.
Но если очень хочется cmake, то можно сделать "программу запускалку" - маленькую программу, которая поищет dll, добавит в PATH и запустит основной бинарник. А CMake сделает просто возможность скомпилировать два бинаря.