维护32/64位构建的公共源代码并使用正确的库

时间:2015-07-30 07:35:21

标签: c++ visual-studio visual-c++ 32bit-64bit

环境:Visual Studio 2008 Professional

我们将32位Windows应用程序移植到64位。我们的应用程序使用许多Microsoft dll,如htmlhelp.dll。为此我们将他们的导入库添加到项目中。

现在我们有32位和64位版本的htmlhelp.lib(令人惊讶的是它们都有相同的名称)。为什么MS给了他们相同的名字。应用程序如何为当前构建平台选择正确的.lib。

寻找处理此类情况的一般准则。

2 个答案:

答案 0 :(得分:1)

将它们放在不同的目录中:How to use the correct unmanaged DLL file according CPU architecture? (32 / 64 bits)

  

SetDllDirectory函数会影响对该函数的所有后续调用   LoadLibrary和LoadLibraryEx函数。它也有效地禁用   指定目录在搜索中时安全的DLL搜索模式   路径。

     

调用SetDllDirectory后,标准DLL搜索路径为:

The directory from which the application loaded.
The directory specified by the lpPathName parameter.
The system directory. Use the GetSystemDirectory function to get the path of this directory. The name of this directory is System32.
The 16-bit system directory. There is no function that obtains the path of this directory, but it is searched. The name of this directory
     

是系统。       Windows目录。使用GetWindowsDirectory函数获取此目录的路径。       PATH环境变量中列出的目录。

     

每次调用SetDllDirectory函数时,它都会替换   在前一个SetDllDirectory调用中指定的目录。要指定   多个目录,使用AddDllDirectory函数并调用   LoadLibraryEx with LOAD_LIBRARY_SEARCH_USER_DIRS。

     

要还原为LoadLibrary使用的标准搜索路径   LoadLibraryEx,使用NULL调用SetDllDirectory。这也恢复了安全   DLL搜索模式基于SafeDllSearchMode注册表值。

     

要编译使用此功能的应用程序,请定义_WIN32_WINNT   为0x0502或更高版本。有关更多信息,请参阅使用Windows   头。

我对交叉平台构建脚本使用相同的技术:

# OS-dependant tools and files
ifeq ($(OS), Windows_NT)
    ARCH = win
else
    ARCH = linux
endif

TMP := tmp_$(ARCH)
LIB := lib_$(ARCH)
BIN := bin_$(ARCH)

在VisualStudio中,为每个体系结构创建一个Debug和Release构建配置,并相应地指向工作目录(放置dll的位置)。

答案 1 :(得分:1)

为lib这样的库创建公共文件夹,其中有两个子文件夹,命名为构建目标(x86和x64)。然后添加

项目属性 - >链接器 - >一般

其他图书馆目录

$(PlatformTarget)

适用于所有配置。 如果您有不同的Debug和Release版本,也可以创建这样的子文件夹,比如lib \ x64 \ Debug,并添加到您的目录中

$(PlatformTarget)\ $(配置)