正确链接命令行中的库

时间:2015-10-13 18:33:52

标签: c++ windows mingw

前言:我对C ++很陌生,刚刚开始认真编程。

序言后:我试图发布我在这篇文章中提到的功能/页面的链接,但Stack Overflow对我大吼大叫,因为我没有足够的声誉来发布两个以上的链接。

我正在尝试使用MinGW和命令行使用Windows API在C ++中创建一些简单的GUI。我正在尝试更改窗口背景,有助于执行此操作的一个函数是CreateSolidBrush函数。这个函数需要gdi32库,但每次我尝试编译/链接到这个库时,我都会收到“无法找到该库,sucka”的错误。

Page1page2提供有关MinGW库功能的有用信息。 Stack Overflow post#5683058和#17031290描述了我认为与我相似的问题/问题。我已经广泛搜索了一个关于如何从其他目录(尤其是Windows库)链接文件/库的简单而直接的答案,但是没有运气从这些页面实现知识。也许答案是正确地盯着我,但我“看猫,画老虎”的英勇努力是徒劳的。我可能会输入错误的路径/名称(lib vs dll?),或者我可能完全忽略了一些更基本的东西(缺少标题?)。我尝试使用的一个命令是

g++ -LC:\WINDOWS\System32 -lgdi32 gui.cpp

但这似乎不起作用(注意:源文件名为“gui.cpp”)。

问题1:简单来说,链接到当前目录中标题/源文件的正确表示法/命令是什么?

问题2:链接到当前目录中 的正确表示法/命令是什么?

问题3:链接到当前目录中 的正确表示法/命令是什么?

我意识到这些问题在其他页面上以各种方式有点回答,但是它们经常混杂着关于Visual Studio,Eclipse,Code :: Blocks等的指示,因此对于放弃的新手来说并不清楚IDE的奢侈品。我很感激你的典型,普通的菜鸟的直截了当的答案。非常感谢您的任何帮助或指导。

我会发布我的代码,但我认为前五行中只有几行是相关的:

#include <windows.h>
#include <string>

COLORREF desired_color = RGB(200,200,200);
HBRUSH hBrush = CreateSolidBrush(desired_color);

static char str_class_name[]  = "MyClass";
static char str_titlebar[] = "My Window Title";
static int window_width = 300;
static int window_height = 300;

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

static HINSTANCE program_global_instance = NULL;

int WINAPI WinMain(HINSTANCE program_current_instance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    program_global_instance = program_current_instance;
    WNDCLASSEX window_class;
    HWND window_handle;
    MSG window_message;

    window_class.cbSize        = sizeof(WNDCLASSEX); // size of struct; always set to size of WndClassEx
    window_class.style         = 0; // window style
    window_class.lpfnWndProc   = WndProc; // window callback procedure
    window_class.cbClsExtra    = 0; // extra memory to reserve for this class
    window_class.cbWndExtra    = 0; // extra memory to reserve per window
    window_class.hInstance     = program_global_instance; // handle for window instance
    window_class.hIcon         = LoadIcon(NULL, IDI_APPLICATION); // icon displayed when user presses ALT+TAB
    window_class.hCursor       = LoadCursor(NULL, IDC_ARROW); // cursor used in the program
    window_class.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); // brush used to set background color
    window_class.lpszMenuName  = NULL; // menu resource name
    window_class.lpszClassName = str_class_name; // name with which to identify class
    window_class.hIconSm       = LoadIcon(NULL, IDI_APPLICATION); // program icon shown in taskbar and top-left corner

    if(!RegisterClassEx(&window_class)) {
        MessageBox(0, "Error Registering Class!", "Error!", MB_ICONSTOP | MB_OK);
        return 0;
    }

    window_handle = CreateWindowEx(
        WS_EX_STATICEDGE, // dwExStyle: window style
        str_class_name, // lpClassName: pointer to class name
        str_titlebar, // lpWindowName: window titlebar
        WS_OVERLAPPEDWINDOW, // dwStyle: window style
        CW_USEDEFAULT, // x: horizontal starting position
        CW_USEDEFAULT, // y: vertical starting position
        window_width, // nWidth: window width
        window_height, // nHeight: window height
        NULL, // hWndParent: parent window handle (NULL for no parent)
        NULL, // hMenu: menu handle (Null if not a child)
        program_global_instance, // hInstance : current window instance
        NULL // lpParam -Points to a value passed to the window through the CREATESTRUCT structure.
        );

    if (window_handle == NULL) {
        MessageBox(0, "Error Creating Window!", "Error!", MB_ICONSTOP | MB_OK);
        return 0;
    }

    ShowWindow(window_handle, nCmdShow);
    UpdateWindow(window_handle);

    while(GetMessage(&window_message, NULL, 0, 0)) {
        TranslateMessage(&window_message);
        DispatchMessage(&window_message);
    }

    return window_message.wParam;
}

// window_handle: window ID
// uMsg: window message
// wParam: additional message info; depends on uMsg value
// lParam: additional message info; depends on uMsg value
LRESULT CALLBACK WndProc(
    HWND window_handle, 
    UINT Message, 
    WPARAM wParam, 
    LPARAM lParam
    ) {
    switch(Message) {
        case WM_CLOSE:
            DestroyWindow(window_handle);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(window_handle, Message, wParam, lParam);
    }
    return 0;
}

1 个答案:

答案 0 :(得分:1)

  

问题1:为了简单起见,链接到不在当前目录中的各个头文件/源文件的正确符号/命令是什么?

没有链接,编译/包括(除非你先将这些源文件编译成目标文件)。

所以:

gcc {other options} -o gui.exe gui.cpp /path/to/source_file_one.cpp /path/to/source_file_n.cpp

或者,首先编译其他人:

gcc {other options} -c -o source_file_one.o /path/to/source_file_one.cpp
gcc {other options} -c -o source_file_n.o /path/to/source_file_n.cpp
gcc {other options} -o gui.exe source_file_n.o source_file_one.o gui.cpp

-c告诉gcc不要尝试将事物链接在一起,因为这是在最后一步中完成的。

{other options}可以包含-I{include dirs},以便在您#include某事时通知gcc。

  

问题2:链接到当前目录中的库的正确符号/命令是什么?

见3; -L.应该有用。

  

问题3:链接到不在当前目录中的库的正确表示法/命令是什么?

你做得对,到目前为止:-L告诉gcc要查看库的路径,以及针对库的-l{libname}链接。