【问题标题】:Linking against third-party libraries when doing cross-platform build in Visual Studio 2015在 Visual Studio 2015 中进行跨平台构建时链接第三方库
【发布时间】:2015-08-14 15:29:40
【问题描述】:

我正在尝试使用 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")

我收到链接器错误:

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

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

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

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

【问题讨论】:

  • 您在硬盘上找到这些文件了吗? vs2010 位似乎很奇怪。
  • 是的,他们在那里。我还使用 VS2015 编译了它们(工作正常!),但这并没有改变任何东西。我收到相同的链接器错误。当我重命名一个库以使路径不再正确时,我得到一个不同的错误,所以我确信 VS2015 应该找到该库。
  • @kfsone 没那么容易,因为它是一个链接和编译的链条。
  • @tmighty,您还在尝试为 Android 构建应用程序吗?如果是,您需要构建(或查找).a 库。 .lib 仅适用于 Windows。另外,在下载您的项目并运行它时,我收到了另一个错误,clang.exe : error : no such file or directory: '..\..\..\voice\opuscodec.cpp' 您的上传似乎不完整。

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


【解决方案1】:

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

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

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

【讨论】:

  • 1) 你确定我可以像使用 lib 一样在我的 VS2015 共享对象中使用 libopus.a 吗? 2) 你确定我不能使用#pragma comment(lib, ...) 吗?在clang 文档中据说可以使用:clang.llvm.org/docs/UsersManual.html(参见“clang 支持Microsoft #pragma comment(lib, "foo.lib")...” 3)我没有将clang.exe 放在任何地方。 VS2015 做到了。
  • @tmighty, 1) 是的,在为 Android 开发时,您应该链接 lib*.a 而不是 *.lib,并且该库应该专门为 Android 编译。 2) 你可以在手册中阅读 Clang 理解 #pragma comment(lib, ...) 只有当 Windows 是目标并且使用 MS 链接器时。否则它会被忽略(带有警告)。 3) 非常非常奇怪……不知道,VS2015在你的项目根目录下还有什么?
  • 1) 感谢您提供的信息。 2)我没有看到这个评论,谢谢你的澄清。 3)有太多的文件要提。你可以在下载我的项目时看到它们。
  • 我按照您的建议添加了 opuslib.a 并将我的项目切换到 ARM。然后它会编译。
【解决方案2】:

在 windows 上使用 clang 是 fairly new,所以大多数时候人们在谈论 clang 时,他们在使用 .a.so 文件而不是 .lib 的 Unix、Linux 或 BSD 类型系统上使用它和.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 工具链。

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

【讨论】:

  • 如果这行得通,我将成为地球上最幸福的人。请问你自己试过了吗?您没有使用 clang 编译的 Opus 版本,是吗?
  • 我无法在 Configuration->General->Platformtoolset for Opus 下选择“Clang 3.4”。
  • 你认为我可以用 Clang 编译一个库,还是它只会创建 .so 或 .a 文件?我问是因为我不知道我是否可以在 MyApp 中使用除 .lib 之外的任何东西。非常感谢大家的帮助!
猜你喜欢
  • 1970-01-01
  • 2015-12-25
  • 1970-01-01
  • 1970-01-01
  • 2017-03-09
  • 1970-01-01
  • 2021-02-10
  • 1970-01-01
  • 2023-03-31
相关资源
最近更新 更多