Я программист Java, но я изучаю C++ для проекта, который мне нужно сделать (JNI). С этой целью я написал очень простую DLL с очень простой программой тестирования DLL на C++ с использованием Eclipse и MinGW GCC. При попытке запустить тестовую программу в Windows 7 (и любой другой версии, которая у меня есть) я получил сообщение об ошибке libgcc_s_dw2-1.dll. Прочитав некоторые другие вопросы о SO, я узнал о параметрах компоновщика -static-libgcc и -static-libstdc++, которые я добавил в настройки проекта. Размеры файлов DLL и exe были очень маленькими до того, как я добавил статические параметры, а после их добавления DLL и exe стали намного больше, что заставило меня поверить, что DLL действительно включались. Тем не менее, я все еще получаю ошибки отсутствующей DLL при попытке запустить программу. Если я скопирую DLL в ту же папку, что и исполняемый файл, он запустится. я читал некоторые предложения о том, что нужно просто распространять DLL отдельно, но это далеко не идеально, и я хотел бы избежать этого, если это возможно.
Я также пытался просто использовать параметр компоновщика -static, но по какой-то причине, когда я это делаю, компилятор не может найти мою простую DLL. Если я удалю -static, он снова сможет найти его. Я не уверен, о чем это, но, может быть, это связано с общей проблемой?
Я прочитал почти все, что мог найти по этой теме, и кажется, что я поступаю правильно, и что библиотеки DLL статически связываются с exe, но во время выполнения это не влияет. Я в своем уме. Мы будем очень признательны за любые советы.
Спасибо, Пабло
ОБНОВЛЕНИЕ 1 Думаю, я не совсем ясно выразился. Проблема в том, что Windows говорит, что библиотеки C отсутствуют, хотя я связываю их статически. Когда я запускаю сборку, выполняются команды компиляции и компоновщика:
g++ "-IC:\\_projects_eclipse\\bcsdll\\src\\" "-includeC:\\_projects_eclipse\\bcsdll\\src\\bcsdll.h" -O0 -g3 -Wall -c -fmessage-length=0 -o Main.o "..\\Main.cpp"
g++ "-LC:\\_projects_eclipse\\bcsdll\\Debug" -Wl,-enable-stdcall-fixup -static-libgcc -static-libstdc++ -o bcsdll_tester.exe Main.o -lbcsdll
Проблема в том, что, несмотря на то, что я статически включаю обе библиотеки C, когда я запускаю EXE, я все равно получаю ошибку отсутствующей DLL для библиотек C. Когда я проверяю EXE и DLL с помощью Dependency Walker, он ясно показывает отсутствие зависимости от двух библиотек C. Тем не менее, когда я запускаю окна EXE, говорит, что библиотека C++ отсутствует. Если я положу копии библиотек в одну папку с моими DLL и EXE, то программа запустится нормально.
Фактическая отсутствующая DLL — это libgcc_s_dw2-1.dll. Если я помещу копию этой DLL в папку EXE, то отсутствующей DLL будет libstdc++-6.dll.