Страницы

Поиск по вопросам

пятница, 10 января 2020 г.

“[Error] ld returned 1 exit status” постоянно, от разных реализаций функций, делающих скрин

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

Комментариев нет:

Отправить комментарий