Windows 说 64 位可执行文件是“不受支持的 16 位应用程序”

用户2690730

我有一个 C++ 程序,它链接 Google 的 WebRTC 库,当我以 32 位为目标时编译并成功运行,但当我以 64 位为目标时根本不起作用。经过一些试验和错误,我创建了以下程序:

#include <media/base/adapted_video_track_source.h>

class AdaptedVideoTrackSource : rtc::AdaptedVideoTrackSource
{
public:
  void AddRef() const {}
  rtc::RefCountReleaseStatus Release() const { return rtc::RefCountReleaseStatus::kDroppedLastRef; }
  bool is_screencast() const {return false;}
  absl::optional<bool> needs_denoising() const {return false;}
  bool GetStats(webrtc::VideoTrackSourceInterface::Stats* stats) {return false;}
  webrtc::MediaSourceInterface::SourceState state() const {return webrtc::MediaSourceInterface::kLive;}
  bool remote() const {return false;}
};

int main() {
  AdaptedVideoTrackSource source;
}

该程序失败并出现以下错误:在此处输入图片说明如果我删除超类,程序运行良好。

我究竟如何调试这样的问题?我不知所措,因为我无法完全调试程序。dumpbin 似乎认为我的 webrtc 库很好,但warning LNK4048: Invalid format file; ignored对我的可执行文件

构建过程中有很多步骤,我认为我无法将所有步骤都放在这里。我使用带有 ExternalProject_Add 的 CMake 来下载和构建 webrtc。我生成 Ninja 生成文件来构建我的代码。以下是用于链接 exe 的忍者规则。

rule CXX_EXECUTABLE_LINKER__Test
  command = cmd.exe /C "$PRE_LINK && "C:\Program Files\CMake\bin\cmake.exe" -E vs_link_exe --intdir=$OBJECT_DIR --rc=C:\PROGRA~2\WI3CF2~1\10\bin\100183~1.0\x64\rc.exe --mt=C:\PROGRA~2\WI3CF2~1\10\bin\100183~1.0\x64\mt.exe --manifests $MANIFESTS -- C:\PROGRA~2\MIB055~1\2017\COMMUN~1\VC\Tools\MSVC\1416~1.270\bin\Hostx64\x64\link.exe /nologo $in  /out:$TARGET_FILE /implib:$TARGET_IMPLIB /pdb:$TARGET_PDB /version:0.0  $LINK_FLAGS $LINK_PATH $LINK_LIBRARIES && $POST_BUILD"
  description = Linking CXX executable $TARGET_FILE
  restat = $RESTAT

build utest\Test.exe: CXX_EXECUTABLE_LINKER__Test utest\CMakeFiles\Test.dir\main.cpp.obj | <OTHER LIBARIES> || <OTHER LIBARIES>
  FLAGS = /DWIN32 /D_WINDOWS /GR /EHsc /bigobj /Zi /Ob0 /Od /RTC1 -MTd
  LINK_FLAGS = /machine:x64 /debug /INCREMENTAL /subsystem:console
  LINK_LIBRARIES = <OTHER LIBARIES> webrtc_bundle.lib <OTHER LIBRARIES>
  LINK_PATH = -LIBPATH:D:\Folder\install64\lib
  OBJECT_DIR = utest\CMakeFiles\Test.dir
  POST_BUILD = cd .
  PRE_LINK = cd .
  TARGET_COMPILE_PDB = utest\CMakeFiles\Test.dir\
  TARGET_FILE = utest\Test.exe
  TARGET_IMPLIB = utest\Test.lib
  TARGET_PDB = utest\Test.pdb

这是私有代码,所以我重命名了我构建的可执行文件并将非 webrtc 库替换为<OTHER LIBARIES>.

这是我用来构建 webrtc 的 args.gn:

target_cpu="x64"
rtc_enable_protobuf=true
is_official_build=false
rtc_build_examples=false
rtc_include_tests=false
enable_iterator_debugging=true
is_clang=false

此外,我编写了自己的 BUILD.gn 文件,将 webrtc 与 Google 的构建系统可以构建的其他库捆绑在一起。

更新

我发现我可以手动链接我的 obj 文件并制作一个非常好的 exe。然后我开始进入由 CMake 生成的 Ninja Makefile 并尝试使用链接器规则。我发现如果我/debug从链接器标志中删除,那么一切都很好。当然,我希望能够调试我的调试版本。

用户2690730

我继续前进并尝试使用 clang-cl 和 lld-link 开始构建我的项目,这提供了更多的诊断输出。我开始收到有关链接不同版本的运行时库的警告。MSVC_RUNTIME_LIBRARY 设置正确,我在 CMAKE_CXX_FLAGS 和 CMAKE_LINKER_FLAGS 中有 /MTd 标志,但是通过使用详细设置运行 ninja,我可以看到我的标志后面是 /MDd,它覆盖了以前的运行时设置。最终我将 /MTd 附加到 CMAKE_CXX_FLAGS_DEBUG 和 CMAKE_CXX_FLAGS_RELEASE ,现在它是编译器和链接命令中的最后一个运行时标志,从那以后我就没有遇到过这个问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C ++可执行文件无法在Windows 7中运行-64位不兼容

如何使用mingw-w64编译和链接32位Windows可执行文件

对于64位Windows上的32位应用程序,是64位操作是原子操作

16位程序集与64位Windows不兼容7

为什么我的64位可执行文件比32位可执行文件大3倍?

如果可执行文件不存在,如何安装32位或64位可执行文件?

在64位可执行文件中执行64位计算

在Windows / Linux上使用python3脚本检查可执行文件是32位还是64位

如果我们可以在64位Windows上运行32位可执行文件,为什么不能将其转换?

Windows 32位和64位JavaFX应用程序的单个安装程序

gfortran:在64位系统中编译32位可执行文件

在32位和64位计算机上的C / C ++可执行文件

无法在64位Ubuntu上运行32位动态可执行文件

在64位Debian Jessie上运行32位可执行文件

Delphi:将ImageBase设置为大于32位(对于64位Windows应用程序)

无法在64位Windows计算机中启动32位RCP应用程序

将64位本机Windows应用程序设置为默认程序

将函数调用添加到64位Visual C ++可执行文件中

为什么32位可执行文件不能在WoW64下运行?

在Ubuntu中哪里可以找到IntelliJ IDEA 64位可执行文件?

自动测试应用程序可执行文件(基于Windows的应用程序)

/ home /失忆症/ myfile:找不到命令— 64位可执行文件,64位内核

如果应用程序是使用“任何Cpu”配置构建的,则该应用程序将在64位Windows上使用哪种.net框架(32或64位)

Windows 10说32位和64位处理器?

如何在Windows(使用Qt Creator)上构建64位MinGW Qt应用程序

在64位Windows 8.1和Qt上的MIDI应用程序-指针大小的问题

在Windows 7 64位上运行旧版命令行应用程序

64位Delphi桌面应用程序可以通过Windows 8.1认证吗?

如何使一个非常老的应用程序在64位Windows上运行?