Я пытаюсь найти способ хранить все мои зависимые библиотеки в подпапке, скажем, /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 кодов мой источник потеряет такую свободу.