#cpp #c #winapi #devcpp
Понадобилась функция, делающая скриншот в программе и сохраняющая его в файл. Я нашёл несколько таких функций, но каждая (!) из них при добавлении в программу заставляет её выдавать при компиляции вот такую ошибку: C:\{папка_с_файлом.cpp}\collect2.exe [Error] ld returned 1 exit status Причём других ошибок нет, или я их исправляю. Обычно такая ошибка происходит, когда у меня код уже скомпилирован и запущен .exe, и я пытаюсь ещё раз его скомпилировать и запустить. Но, разумеется, я всё перепробовал, даже запускал код на другом компе (но тоже в Dev) - такая же ошибка. Если убрать эту функцию, то код снова нормально работает. Подскажите, что делать? Вот текущий код с одним из вариантов функции, делающий скриншот: #include//Ws2_32.lib #include #include #include #include #include #include //getch #include #include #include #include #include //#include #define ever (;;) #include #pragma comment(lib, "GdiPlus.lib") //Тут всякий другой код. Вообще, программа для работы с сетью (это клиент). //Но она даже не запускается, выдаёт ту ошибку. using namespace std; using namespace Gdiplus; static const GUID png = { 0x557cf406, 0x1a04, 0x11d3, { 0x9a, 0x73, 0x00, 0x00, 0xf8, 0x1e, 0xf3, 0x2e } }; int PrtScr() { GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); HDC scrdc, memdc; HBITMAP membit; scrdc = GetDC(0); int Height, Width; Height = GetSystemMetrics(SM_CYSCREEN); Width = GetSystemMetrics(SM_CXSCREEN); memdc = CreateCompatibleDC(scrdc); membit = CreateCompatibleBitmap(scrdc, Width, Height); SelectObject(memdc, membit); BitBlt(memdc, 0, 0, Width, Height, scrdc, 0, 0, SRCCOPY); HBITMAP hBitmap; hBitmap =(HBITMAP) SelectObject(memdc, membit); Gdiplus::Bitmap bitmap(hBitmap, NULL); char PerMin[12]; strcpy (PerMin,"screen.png" ); bitmap.Save((WCHAR*)PerMin, &png,NULL); DeleteObject(hBitmap); return 0; } ///////////////////////////////////////////////////// int main() { printf ("OK1\n"); getch(); PrtScr(); printf ("OK2\n"); getch(); //Тут всякий иной код return 0; }
Ответы
Ответ 1
ld returned 1 exit status обычно означает, что у Вас в коде есть недопустимые символы. Они могут там быть даже если их вроде и не видно, например, русская буква е от английской e на первый взгляд ничем не отличается. Обычно это результат копипасты. Так как функция небольшая, то самый простой вариант для Вас решить проблему - переписать ее (вернее, всю копипасту) руками. Update Так же, проблемой может быть неподключенная библиотека. Нужно посмотреть по списку подключенных заголовочных файлов, к каким библиотекам они относятся и в натсройках проекта добавить все отсутствующие библиотеки. Проблемой может быть и какой-то неподключенный заголовочный файл. Тут надо смотреть по названиям используемых функций и искать заголовки, где они объявлены.Ответ 2
При неподключённой библиотеке или опечатке в определении метода линкер всегда указывает, какой именно метод неопределён. По его имени можно грепнуть, где он определяется и подлинковать либу. Я столкнулся с такой же проблемой без какой-либо дополнительно информации от линкера, тоже долго чесал репу и искал опечатки, но в итоге заметил, что на диске, где собираюсь, мало места. Перенёс исходники на накопитель побольше - там сразу нормально слинковалось. Возможно, решение проблемы AlfredBauer'ом связано с тем же, т.к. 32-битные бинарники занимают меньше места. В общем, при недостатке места на этапе линковки может выводиться подобное сообщение без поясняющей информации. Словил на CentOS 6.9, g++ 4.8.2, glibc 2.12.Ответ 3
Решил такую проблему изменением режима компиляции с х64 на х32. При этом, у меня были подключены дополнительные библиотеки(которые были скомпилированы MinGW), с которыми компилятор видимо не мог работать в таком режиме.
Комментариев нет:
Отправить комментарий