我对DLL和LIB知之甚少,除了它们包含程序正常运行所需的重要代码 - 库.但是为什么编译器会生成它们呢?将所有代码包含在单个可执行文件中会不会更容易?DLL和LIB之间的区别是什么?
我正在使用GNU binutils在Windows上使用程序集构建一个dll.
我知道可以在加载可执行文件时或在运行时加载dll(使用LoadLibrary api调用).
对于加载时加载,我似乎只需要dll文件:不需要.a,.lib或.def文件.我想知道这些文件格式代表什么,它们的用途是什么.
我所知道的和一些具体问题:
.a是Unix上通常用于静态库的扩展..a文件是使用GNU ld 的--out-implib选项生成的.它被认为是一个"进口图书馆",足够公平.问题是"如果我在链接时不需要它,那对我来说有什么用?"
.lib是Windows上用于静态库的扩展,根据维基百科,在windows下也被用作"导入库",所以我强烈怀疑它们只是binutils调用.a文件的另一个名称.真假 ?
我可以找到的所有页面都指出.def文件列出了dll的导出符号.这与"导入库"应该做的有点类似吗?
另外,我在这里读到使用.def文件是在源文件中手动指定导出的替代方法(我做过).但我还记得读取(找不到引用).def文件为导出的符号提供索引(序号),允许更快的运行时加载.是这样吗 ?
我正在创建一个使用DLL的项目.要构建我的项目,我需要包含一个头文件和一个lib文件.为什么我需要包含相应的lib文件?不应该头文件声明所有需要的信息,然后在运行时加载任何所需的库/ DLL?
谢谢
在尝试运行我在Visual Studio 2012中构建的C++ SFML 32位程序的exe文件后,我收到错误"应用程序无法正确启动(0xc000007b)".我在我的项目中静态链接了SFML dll,但是以下dll和我的程序:
libsndfile-1.dll
openal32.dll
msvcp110.dll
msvcp110d.dll
msvcr110.dll
msvcr110d.dll
Run Code Online (Sandbox Code Playgroud)
问题是什么?
我是OpenCL的新手。在运行Windows 7的具有Intel(R)HD Graphics 4000的Core i5计算机上工作,我安装了支持OpenCL的最新Intel驱动程序。GpuCapsViewer确认我具有OpenCL支持设置。我使用英特尔OpenCL SDK开发了一个简单的HelloWorld程序。我已经成功编译了程序,但是运行时,由于分段错误而调用clGetPlatformIDs()时,它崩溃了。这是我的代码:
#include <iostream>
#include <CL/opencl.h>
int main() {
std::cout << "Test OCL without driver" << std::endl;
cl_int err;
cl_uint num_platforms;
err = clGetPlatformIDs(0, NULL, &num_platforms);
if (err == CL_SUCCESS) {
std::cout << "Success. Platforms available: " << num_platforms
<< std::endl;
} else {
std::cout << "Error. Platforms available: " << num_platforms
<< std::endl;
}
std::cout << "Test OCL without driver" << std::endl;
std::cout << "Press button to exit." << std::endl;
std::cin.get();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
GpuCapsViewer如何成功确认OpenCL支持并可以使用它运行其演示,但我却无法运行我的代码?两者必须使用相同的功能,对吗? …
使用visual studio 2008,我有一个.H和.LIB一个库的文件.我编写了一个程序,并通过项目属性引用了LIB.它编译得很好,但是当它运行时,它会要求安装DLL.如果DLL与EXE它的工作方式在同一个目录中,但如果我有LIB,那么它是不是已经意味着这些函数与我的程序静态链接?