C 我应该在源代码中加载DLL还是只加载其头文件?我希望能够在linux上构建相同的源代码

C 我应该在源代码中加载DLL还是只加载其头文件?我希望能够在linux上构建相同的源代码,c,linux,winapi,dll,sdl-2,C,Linux,Winapi,Dll,Sdl 2,我正试图找到一种方法,将所有依赖库存储在子文件夹中,比如说/libs,并将可执行文件存储在该文件夹之外。据我所知,我需要将这个库文件夹添加到系统路径中,或者添加一些代码,例如HINSTANCE hDLL=LoadLibrary(“.\\libs\\mydll.DLL”)输入我的源代码(如果我在这里错了,请纠正我,我对此不是很确定) 然而,问题是,我也希望能够在Linux上编译相同的源代码,而不必每次从一个操作系统切换到另一个操作系统时都对其进行修改。这可能吗?我怎样才能在C语言中做到这一点?如果

我正试图找到一种方法,将所有依赖库存储在子文件夹中,比如说
/libs
,并将可执行文件存储在该文件夹之外。据我所知,我需要将这个库文件夹添加到系统路径中,或者添加一些代码,例如
HINSTANCE hDLL=LoadLibrary(“.\\libs\\mydll.DLL”)输入我的源代码(如果我在这里错了,请纠正我,我对此不是很确定)

然而,问题是,我也希望能够在Linux上编译相同的源代码,而不必每次从一个操作系统切换到另一个操作系统时都对其进行修改。这可能吗?我怎样才能在C语言中做到这一点?如果可能的话,你能告诉我这个行业最标准的方法吗

我知道将所有DLL与可执行文件放在一起可以立即解决这个问题,但这只是完全避免了这个问题,我有兴趣了解更多关于这个主题的信息

例如,这里有一个小C代码,可以帮助我初始化一些SDL2功能:

#包括
#包括
#包括“SDL2\SDL.h”
#包括“SDL2\SDL_messagebox.h”
#包括“SDL2\SDL_image.h”
#包括“SDL2\SDL\u ttf.h”
#定义最大键盘按键350
#定义屏幕宽度1280
#定义屏幕高度720
类型定义结构{
SDL_渲染器*渲染器;
SDL_窗口*窗口;
int键盘[最大键盘键];
}应用程序;
应用程序;
void initSDL(){
/*
启动SDL2、SDL_映像和SDL_ttf的过程
记录错误并在失败时退出程序。
*/
int renderFlags、windowFlags、imgFlags;
RenderFlags=SDL\u渲染器\u加速;
windowFlags=0;
imgFlags=IMG_INIT_PNG | IMG_INIT_JPG;
//启动SDL填充。如果返回值<0,则出现错误
if(SDL_Init(SDL_Init_视频)<0){
printf(“未能初始化SDL:%s”,SDL_GetError());
出口(1);
}
//创建一个窗口
app.window=SDL_CreateWindow(“pong”,SDL_WINDOWPOS_未定义,SDL_WINDOWPOS_未定义,屏幕宽度,屏幕高度,窗口标志);
如果(!应用程序窗口){
SDL_LogMessage(SDL_LOG_CATEGORY_应用程序,SDL_LOG_PRIORITY_错误,“未能创建窗口:%s”,SDL_GetError());
出口(1);
}
//为SDL设置提示
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY,线性);
//创建渲染器
app.renderer=SDL_CreateRenderer(app.window,-1,renderFlags);
如果(!app.renderer){
SDL_LogMessage(SDL_LOG_CATEGORY_应用程序,SDL_LOG_PRIORITY_错误,“未能创建渲染器:%s”,SDL_GetError());
出口(1);
}
//初始IMG
if(IMG_Init(imgFlags)==0){
SDL_LogMessage(SDL_LOG_CATEGORY_应用程序,SDL_LOG_PRIORITY_错误,“未能初始化SDL_映像:%s”,SDL_GetError());
出口(1);
}
//初始TTF
如果(TTF_Init()=-1){
SDL_LogMessage(SDL_LOG_CATEGORY_应用程序,SDL_LOG_PRIORITY_错误,“未能初始化SDL_ttf:%s”,SDL_GetError());
出口(1);
} 
}
空洞清理(){
/*
优雅地退出所有设施并宣布程序正常退出的过程
*/
SDL_渲染器(应用程序渲染器);
SDL_窗口(应用程序窗口);
IMG_Quit();
TTF_Quit();
SDL_日志消息(SDL_日志_类别_应用程序,SDL_日志_优先级_信息,“正常退出”);
SDL_退出();
}
int main(int argc,char*argv[]){
/*
在这里,我们可能会使用HINSTANCE hDLL=LoadLibrary(“.\\libs\\mydll.DLL”);
处理libs文件夹中的所有DLL
*/
initSDL();
脱欧(清理);
出口(0);
}

现在幸运的是,如果我选择自己的话,这段代码可以在Windows(mingw32)和Linux上编译。我担心的是,在添加特定于Windows的代码后,我的源代码将失去这种自由。

在Windows上,您使用隔离感知清单来处理DLL的这种组织。也就是说,如果你绝对必须将DLL与你的可执行文件分开,你应该仔细考虑一个决定。另一个选项是使用DLL而不是使用静态链接或显式动态加载。在使用DLL之前,您可以在运行时调用或。非常感谢David和Remy。如果可能的话,你能解释一下为什么不赞成将DLL与可执行文件分开?至于延迟加载,我想知道我是否能用我的工具链(gcc)做到这一点?它只是让你的生活复杂化了。把它们和可执行文件放在同一个目录中,就没有别的事可做了。但是如果您有复杂的依赖关系,那么将它们打包是有意义的。我个人更喜欢清单方法,因为它意味着您根本不需要代码来解决依赖关系。它是声明性的。加载程序完成了所有工作。@stanle因为您已经使用了SDL,所以它已经完成了(导致windows上的
LoadLibrary
,类unix上的
dlopen
,等等)。但文件名可能不同(除非您真的想误导所有人)。