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

时间:2015-06-01 08:35:08

标签: c++ android-ndk cross-platform clang visual-studio-2015

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

我在stdafx.h中链接Opus Codec库:

#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")

我收到链接器错误:

  

链接器命令失败,退出代码为1(使用-v查看   调用)SharedObject1 C:\ Users \ MyUser \ Documents \ Visual Studio   2015 \ Projects \ SharedObject1 \ SharedObject1 \ clang.exe 1

有人能告诉我如何调查那里可能出错的地方吗? 我在哪里说出这个" -v"?

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

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

2 个答案:

答案 0 :(得分:1)

首先,Opus Codec发行版附带Visual Studio项目,这些项目被配置为仅构建不是跨平台的Windows库。您需要使用跨平台库项目替换这些项目。或更好的替代方案只需下载预建的 libopus.a ,例如来自here

其次,您不能在跨平台项目中使用#pragma comment(lib, ...)。而是将库依赖项添加到项目属性:将opus添加到配置属性 - >链接器 - >输入 - >图书馆依赖;还将包含 libopus.a 的文件夹的路径添加到配置属性 - >链接器 - >一般 - >其他图书馆目录。

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

答案 1 :(得分:0)

使用clang for windows是fairly new,因此大多数时候人们谈论clang时,他们在使用.a.so的Unix,Linux或BSD类型系统上使用它文件而不是.lib.dll个文件。

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

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

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

我最好的猜测是改变其中一个项目以匹配另一个项目的工具链/工具集。