首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Windows称64位可执行文件是“不支持的16位应用程序”

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

Stack Overflow用户
提问于 2020-02-05 01:45:34
回答 1查看 1.6K关注 0票数 1

我有一个C++程序,连接谷歌的WebRTC库,当我瞄准32位时,它成功地编译和运行,但是当我瞄准64位时,根本不工作。经过一些尝试和错误之后,我创建了以下程序:

代码语言:javascript
运行
复制
#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

在构建过程中有很多步骤,我认为我不能把它们都放在这里。我使用CMake和ExternalProject_Add下载并构建webrtc。我生成忍者制作文件来构建我的代码。下面是用于链接exe的忍者规则。

代码语言:javascript
运行
复制
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

它是私有代码,所以我重新命名了我构建的可执行文件,并用<OTHER LIBARIES>替换了非webrtc库。

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

代码语言:javascript
运行
复制
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与谷歌的构建系统可以构建的其他库捆绑在一起。

更新

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-27 03:19:24

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60067946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档