Должен ли я загрузить DLL в исходный код или просто его заголовочный файл? Я хочу иметь возможность построить тот же источник на linux - PullRequest
0 голосов
/ 04 февраля 2020

Я пытаюсь найти способ хранить все мои зависимые библиотеки в подпапке, скажем, /libs, и мой исполняемый файл вне этой папки. Из того, что я могу сказать, мне нужно затем добавить эту папку библиотеки в системную переменную PATH или добавить некоторый код, такой как HINSTANCE hDLL = LoadLibrary(".\\libs\\mydll.DLL");, в мой источник (исправьте меня, если я здесь не прав, я не очень уверен в этом).

Однако проблема в том, что я также хотел бы иметь возможность компилировать один и тот же исходный код на Linux без необходимости изменять его каждый раз, когда я переключаюсь с одной ОС на другую. Это возможно? Как я могу сделать это в C? Если возможно, можете ли вы показать мне самый стандартный способ сделать это в отрасли?

Я знаю, что наличие всех моих библиотек DLL вместе с моим исполняемым файлом решит эту проблему мгновенно, но это всего лишь позволяет избежать проблемы и Мне интересно узнать больше об этой топи c.

Например, здесь у меня есть небольшой C код, который помогает мне инициализировать некоторые средства SDL2:

#include <stdio.h>
#include <stdlib.h>

#include "SDL2\SDL.h"
#include "SDL2\SDL_messagebox.h"
#include "SDL2\SDL_image.h"
#include "SDL2\SDL_ttf.h"

#define MAX_KEYBOARD_KEYS 350
#define SCREEN_WIDTH   1280
#define SCREEN_HEIGHT  720

typedef struct {
    SDL_Renderer *renderer;
    SDL_Window *window;
    int keyboard[MAX_KEYBOARD_KEYS];
} App;


App app;

void initSDL() {

    /*
    Procedure to initiate SDL2, SDL_Image, and SDL_ttf
    Log errors and quit the program if failed.
    */

    int rendererFlags, windowFlags, imgFlags;

    rendererFlags = SDL_RENDERER_ACCELERATED;
    windowFlags = 0;
    imgFlags = IMG_INIT_PNG | IMG_INIT_JPG;

    //initiate SDL stuff. If return < 0 error occured
    if (SDL_Init(SDL_INIT_VIDEO) < 0) {
        printf("Failed to initate SDL: %s", SDL_GetError());
        exit(1);
    }

    //create a window
    app.window = SDL_CreateWindow("pong", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, windowFlags);
    if (!app.window) {
        SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_ERROR, "Failed to create window: %s", SDL_GetError());
        exit(1);
    }

    //set hint for SDL
    SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear");

    //create a renderer
    app.renderer = SDL_CreateRenderer(app.window, -1, rendererFlags);
    if (!app.renderer) {
        SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_ERROR, "Failed to create renderer: %s", SDL_GetError());
        exit(1);
    }

    //init IMG
    if (IMG_Init(imgFlags) == 0) {
        SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_ERROR, "Failed to initialize SDL_Image: %s", SDL_GetError());
        exit(1);
    }

    //init TTF
    if (TTF_Init() == -1) {
        SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_ERROR, "Failed to initialize SDL_ttf: %s", SDL_GetError());
        exit(1);
    } 
}

void cleanUp() {

    /*
    Procedure to quit all facilities gracefully and announce a normal exit of the program
    */

    SDL_DestroyRenderer(app.renderer);
    SDL_DestroyWindow(app.window);
    IMG_Quit();
    TTF_Quit();
    SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Exited normally");
    SDL_Quit();
}

int main(int argc, char* argv[]) {

    /*
    Possibly here we will have that HINSTANCE hDLL = LoadLibrary(".\\libs\\mydll.DLL");
    to deal with all the DLLs I have in the libs folder
    */

    initSDL();
    atexit(cleanUp);
    exit(0);
}

Сейчас к счастью, этот код можно скомпилировать как на Windows (mingw32), так и на Linux, если я сам выберусь. Что меня беспокоит, так это то, что после добавления Windows -specifi c кодов мой источник потеряет такую ​​свободу.

...