Параметры ссылки Eclipse CDT -static-libgcc -static-libstdc++, не влияющие на поведение в Windows

Я программист 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.


person Pablo Vadear    schedule 30.03.2015    source источник
comment
Я должен добавить, что я также загрузил Dependency Walker, и, согласно этой программе, нет никакой зависимости от библиотек C и C++, когда я компилирую с параметрами компоновщика, но зависимость ДЕЙСТВИТЕЛЬНО проявляется, когда я компилирую без нее. Я предполагаю, что Windows тупая, но я попробовал несколько разных систем и получил одну и ту же ошибку на всех из них.   -  person Pablo Vadear    schedule 31.03.2015
comment
Не могли бы вы показать нам make-файл или содержимое диалогового окна флагов компиляции?   -  person a3f    schedule 31.03.2015
comment
Я не уверен, где найти make-файл, так как он, по-видимому, в основном автоматизирован IDE. Какой диалог компиляции вы конкретно имеете в виду? Там несколько кажется. В поле C/C++ Build/GCC C++ Compiler/All Options есть следующее: -IC:\_projects_eclipse\bcsdll\src\ -includeC:_projects_eclipse\bcsdll\src\bcsdll.h -O0 -g3 -Wall -c -fmessage -length=0 ОБРАТИТЕ ВНИМАНИЕ, что на самом деле есть \ после -includeC:..., который, похоже, не отображается на сайте.   -  person Pablo Vadear    schedule 31.03.2015
comment
Те, которые были переданы компоновщику. Также некоторые разработки компилятора не могут найти мою простую DLL. было бы полезно.   -  person a3f    schedule 31.03.2015
comment
Ну это не основная проблема. Это было отступление на случай, если это может быть связано. Я пытаюсь решить, почему, хотя я статически включаю библиотеки C и C++, когда я запускаю программу, я все еще получаю сообщение об ошибке, что библиотеки недоступны.   -  person Pablo Vadear    schedule 31.03.2015
comment
Вот используемые параметры компоновщика: g++ -LC:\_projects_eclipse\\bcsdll\\Debug -Wl,-enable-stdcall-fixup -static-libgcc -static-libstdc++ -o bcsdll_tester.exe Main.o -lbcsdll   -  person Pablo Vadear    schedule 31.03.2015


Ответы (2)


Хорошо, я наконец решил это. Я переключился на использование -static без специальных параметров -static-libgcc и -static-libstdc++. Когда я сделал это, мой EXE-компилятор начал выдавать мне ошибки, что он не может найти мой hellodll, хотя он все еще находится в том же месте. Еще немного поиска в Google, и я обнаружил, что мне нужно скомпилировать библиотеку, чтобы получить .a или .so вместо .dll. Поковырявшись в Eclipse CDT, я обнаружил на вкладке C/C++ Build/Settings/Build Artifact, что для параметра Artifact Type установлено значение «Shared Library». Я переключил это на статическую библиотеку, скомпилировал DLL, перекомпилировал EXE, и все работает.

person Pablo Vadear    schedule 31.03.2015

полезно для пользователей Windows, которые используют eclipse для c/c++, но запускают файл *.exe и получают сообщение об ошибке: «отсутствует libstdc++6.dll»

4 пути решения

  1. Eclipse -> "Проект" -> "Свойства" -> "Сборка C/C++" -> "Настройки" -> "Настройки инструмента" -> "MinGW C++ Linker" -> "Разное" -> "Флаги компоновщика" (добавить '-статический' к нему)

  2. Добавьте '{{путь, по которому был установлен ваш MinGW}}/bin' в текущую пользовательскую переменную среды - "Путь" в Windows, затем перезагрузите eclipse и, наконец, перекомпилируйте.

  3. Добавьте «{{путь, по которому был установлен ваш MinGW}}/bin» в переменную среды Windows — «Путь», затем перезагрузите eclipse и, наконец, перекомпилируйте.

  4. Скопируйте файл «libstdc++-6.dll» в папку, где запущен файл *.exe, затем запустите повторно. (это не лучший способ)

Примечание: файл "libstdc++-6.dll" находится в папке "{{путь, по которому был установлен ваш MinGW}}/bin"

person user11335357    schedule 09.04.2019