2016-07-06 31 views
3

我正在创建一个依赖于libxml2的跨平台程序。我不想在应用程序的Windows端口上使用诸如Cygwin或MSYS之类的POSIX环境。我打算创建一个使用Javascript Host for Windows和nmake的构建脚本系统。但是,问题出现在构建系统应该在哪里查找libxml2。在用户没有指定位置时应该看到什么位置?在Linux上,通常是/ usr/lib /和/ usr/local/lib /。但在Windows上,唯一想到的地方是C:\ Windows \ system32。但是不是只有系统修改过的那个目录吗? (我明显知道几乎没有Windows的内部)Windows上的/ usr/lib /相当于什么?

+1

尝试链接静态,如果你可以。节省了很多麻烦。 – Thomas

回答

2

在Windows中真正等效于/usr/lib/真的是%windir%\system32,因为它是always the (last) place where Windows looks for DLLs

但是,简单地倾销你的库的一部分是为什么DLL地狱是一件事情。这就是COM系统引入的原因;如果您的DLL是COM类的“服务器模块”,您可以注册它(例如通过regsvr32实用程序),之后应用程序可以通过CoCreateInstance()函数动态链接其服务类。在这里,注册表服务于/usr/lib/的目的,但是完全不同。

在现代Windows版本中,对于(registration-free) side-by-side assemblies,不再需要显式注册。事实上,有时需要显式注销组件,才能与这个新系统打好关系。从这个意义上说,%SystemRoot%\winsxs相当于/usr/lib/,但是更为复杂。


因为这个烂摊子,回答你的根本问题 ---“我应该在哪里寻找libxml2?” --- 是“你不会找到它”。与用于模块化的操作系统不同,您通常不会在Windows上安装单独的库。如果您想针对libxml2构建,则可以将.lib文件与源代码捆绑在一起,或者告诉用户提供它。如果你想部署一个版本,你可以配置libxml2以及你的应用程序(静态链接,或者作为应用程序目录中的一个DLL)。

即使它被安装在系统范围内,因为libxml2不是针对特定于Windows的概念编写的,唯一可以找到它的地方是%windir%\system32。尽管如此,没有人敢将它放在那里。


注:我不是很精通COM和.NET,因此上述可能不完全准确。如果有人想改进这个答案,我愿意把它变成一个社区维基。

+0

谢谢。我的方法是在Windows上构建libxml2并链接到库,然后将其运送(不确定是否需要静态或动态)与我的项目。因此,在安装之前,.dll或.lib文件将位于项目目录树中的某个位置。 – godisgood4