M@gelearn Ответов: 5

Как добавить другие cpp-файлы в команду компиляции ?


У меня есть сборка кода, и у меня есть 2 cpp-файла. Я действительно включил в заголовок(.h) функцию, и я добавляю также добавить в основной cpp "header.h", но одна ошибка приходит с:

||=== Build: Debug in Ex2CppFILES (компилятор: GNU GCC Compiler) ===|
obj\Debug\main.o||в функции `Z7WndProcP6HWND__jjl@16':|
C:\Users\..............\main.cpp/14/undefined ссылка на `StaticWindow()'|
||ошибка: ld вернул 1 статус выхода|
||=== Ошибка сборки: 2 ошибки,0 предупреждений (0 минут, 0 секунд) ===|

это и есть код:

В main.cpp
//Headers
#include <windows.h>
#include "resources.h"

HWND hwnd;

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
{
    switch(msg)
    {
    case WM_CREATE:
        {
            StaticWindow();
            break;
        }
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProcW(hwnd, msg, wp, lp);
    }
    return 0;
}
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR args, int nCmdShow)
{
    WNDCLASSW wc = {0};

    wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    wc.hInstance     = hInst;
    wc.lpfnWndProc   = WndProc;
    wc.lpszClassName = L"myWindowClass";

    if(!RegisterClassW(&wc))
        return -1;

    hwnd = CreateWindowW(L"myWindowClass", L"Ex2FilesC++", WS_OVERLAPPEDWINDOW,
                  350, 150, 700, 500, NULL, NULL, NULL, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    MSG msg = {0};

    while(GetMessage(&msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}


в resources.cpp
#include <windows.h>
#include "resources.h"

void StaticWindow(HWND hwnd)
{
    CreateWindowW(L"static", L"Static window from resources.cpp", WS_CHILD | WS_VISIBLE,
                  10, 20, 150, 50, hwnd, NULL, NULL, NULL);
}


ресурсы.ч
void StaticWindow();


Что я уже пробовал:

Я использую код::Blocks ver 17.12
и С++ - это язык..

Пожалуйста помочь. Спасибо тебе..!

5 Ответов

Рейтинг:
43

Richard MacCutchan

Извините, что противоречу OriginalGriff, но вам нужно изменить main.cpp таким образом:

HWND hwnd;
extern void StaticWindow(HWND hwnd);  // StaticWindow is an external function


M@gelearn

Я действительно добавил extern, но получаю ту же ошибку..

Richard MacCutchan

Вам нужно добавить оба исходных файла в сборку.

M@gelearn

Оба файла находятся в исходном коде.. Та же ошибка.. Я не понимаю, что я делаю не так

M@gelearn

оки-доки.. сделано..
я не делал этого на WM_CRATE:{ StaticWindow();
перерыв;
}
Я забыл добавить "hwnd" в StaticWindow(hwnd); конечно, это не работает...
Спасибо..

Richard MacCutchan

Прошу прощения, я должен был это заметить.

M@gelearn

Я также не изменил функцию на extern void. Мои извинения, я не должен был писать это, так как мне не хватало только этого..(дескриптор HWND)... Однако.. Я ценю вашу помощь.

Richard MacCutchan

Да, это одна из самых раздражающих особенностей C/C++, что вам нужно писать декларацию и определение в разных местах. Поэтому легко ошибиться в одном из них.

Рейтинг:
2

CPallini

Вот вам и некоторое озарение: Создание нового проекта - CodeBlocks[^].


Рейтинг:
1

M@gelearn

оки-доки.. сделано..
я не делал этого на WM_CRATE:{ StaticWindow();
перерыв;
}
Я забыл добавить "hwnd" в StaticWindow(hwnd); конечно, это не работает...



Спасибо вам всем.. !!!!! :)


Рейтинг:
0

OriginalGriff

Попробуйте добавить extern к вашим услугам resources.cpp определение понятия StaticWindow: Понимание ключевого слова "extern" в C - GeeksforGeeks[^]


Рейтинг:
0

steveb

Я не вижу твоего лица. RESOURCE.CPP будучи скомпилированным(согласно вашему журналу), это означает, что он не входит в вашу цепочку сборки. Добавьте его, и все должно работать просто отлично.


Richard MacCutchan

Смотрите его комментарии к моему решению выше.