Windows 说 64 位可执行文件是“不支持的 16 位应用程序”答案 您所在的位置:网站首页 win11不支持16位应用程序 Windows 说 64 位可执行文件是“不支持的 16 位应用程序”答案

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

2023-03-30 03:33| 来源: 网络整理| 查看: 265

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

#include class AdaptedVideoTrackSource : rtc::AdaptedVideoTrackSource { public: void AddRef() const {} rtc::RefCountReleaseStatus Release() const { return rtc::RefCountReleaseStatus::kDroppedLastRef; } bool is_screencast() const {return false;} absl::optional 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。

构建过程中有很多步骤,我认为我无法将所有步骤都放在这里。我使用 CMake 和 ExternalProject_Add 来下载和构建 webrtc。我生成 Ninja makefile 来构建我的代码。以下是用于链接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 | || FLAGS = /DWIN32 /D_WINDOWS /GR /EHsc /bigobj /Zi /Ob0 /Od /RTC1 -MTd LINK_FLAGS = /machine:x64 /debug /INCREMENTAL /subsystem:console LINK_LIBRARIES = webrtc_bundle.lib 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 Makefiles 并使用链接器规则。我发现如果我从链接器标志中删除/debug,那么一切都会很好。当然,我希望能够调试我的调试版本。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有