#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), с которыми компилятор видимо не мог работать в таком режиме.
Комментариев нет:
Отправить комментарий