在 Visual Studio 2015 年进行跨平台构建时链接第三方库

Linking against third-party libraries when doing cross-platform build in Visual Studio 2015

我正在尝试使用 Visual Studio 2015 RC 编译共享对象 (.so)。

我在 stdafx.h:

中链接 Opus 编解码器库
#pragma comment(lib, "..\..\opus-1.1-beta\win32\VS2010\Win32\Debug\celt.lib")
#pragma comment(lib, "..\..\opus-1.1-beta\win32\VS2010\Win32\Debug\opus.lib")
#pragma comment(lib, "..\..\opus-1.1-beta\win32\VS2010\Win32\Debug\silk_common.lib")
#pragma comment(lib, "..\..\opus-1.1-beta\win32\VS2010\Win32\Debug\silk_fixed.lib")
#pragma comment(lib, "..\..\opus-1.1-beta\win32\VS2010\Win32\Debug\silk_float.lib")

我收到链接器错误:

linker command failed with exit code 1 (use -v to see invocation) SharedObject1 C:\Users\MyUser\Documents\Visual Studio 2015\Projects\SharedObject1\SharedObject1\clang.exe 1

谁能告诉我如何调查那里可能出了什么问题? 我应该在哪里声明这个“-v”?

并且在跨平台项目中使用.libs 不是可以吗?我想知道为什么每个人都谈论 .a 文件、.so,但从来不谈论 .libs。

编辑:如果有人愿意看的话,我已经上传了我的小示例项目here

将 clang 用于 windows 是 fairly new,所以大多数时候当人们谈论 clang 时,他们在 Unix、Linux 或 BSD 类型的系统上使用它,这些系统使用 .a.so 文件,而不是 .lib.dll 文件。

在您上传的示例中,您对库和项目使用了不同的工具集:

  • opus 库是使用 vs2015 工具集 (v140) 构建的
  • 您的项目 MySharedObject 是使用 clang 构建的 (Clang_3_4)

Clang is actually able to use vs2015 libs, when using the Visual C++ linker. 但是,您的项目 MySharedObject 似乎使用了 Android NDK r10d 工具链。

我最好的猜测是更改其中一个项目以匹配另一个项目的 toolchain/toolset。

首先,Opus Codec 发行版附带 Visual Studio 个项目,这些项目被配置为仅构建 Windows 个库,这些库不是跨平台的。您需要将这些项目替换为 Cross Platform Library 项目。或者 更好的选择: 只需下载预构建的 libopus.a,例如来自 here.

其次,不能在跨平台项目中使用#pragma comment(lib, ...)。相反,将库依赖项添加到项目属性中:将 opus 添加到 Configuration Properties -> Linker -> Input -> Library Dependencies;还将包含 libopus.a 的文件夹的路径添加到配置属性 -> 链接器 -> 常规 -> 其他库目录。

第三,您似乎正试图通过将 clang.exe 的某些版本放在项目的根目录中来使用它(您的链接器错误显示了这一点)。一定是大错特错。相反,您需要使用 Android NDK 附带的 Clang。 (确保 NDKROOT 环境变量指向 Android NDK 安装的根目录。)