【问题标题】:How do i build a release exe with DEV C++?如何使用 DEV C++ 构建发布 exe?
【发布时间】:2013-04-12 10:15:24
【问题描述】:

我想构建 exe 以在另一台计算机上工作。我相信我已经找到了程序所需的 dll,并将它们与应用程序以及应用程序在运行时加载的所有文件一起包含在同一目录中。将文件夹放入 USB 中,首先在我的 PC 上对其进行测试,然后运行,将 USB 插入另一台计算机,应用程序在另一台计算机上执行时立即终止。没有丢失 dll 或任何类型的错误,只是打开和关闭。所以我想尝试在发布模式下构建 exe,就像我过去使用 Visual Studio 所做的那样,但我似乎无法在 DEV c++ 中找到任何这样的构建选项。也许那不是我的问题,对我有什么想法吗?

【问题讨论】:

  • 您是否有可能从 32 位机器切换到 64 位机器并且只有 32 位 DLL,反之亦然?
  • 您是动态链接还是静态链接 mscv 运行时?如果您设置为动态链接它们,则必须在目标机器上安装运行时才能运行您的程序。您可以在线为您的编译器找到可再发行组件。
  • 根据依赖walker GPSVC.DLL,我添加到我在system32文件夹中找到的文件夹中,是x64,其他一切都在x86上运行。如果我只是删除 GPSVC.DLL,它会说它丢失了。所以我想我需要一个 x86 版本的 GPSVC.DLL?我该怎么办?我怀疑“googleing GPSVC.DLL”下载会带我到任何地方。
  • 不要使用 Dev-C++。它已经 8 年没有更新了。
  • 我也试过用visual c++ 2010 express,结果是一样的

标签: c++ release dev-c++


【解决方案1】:

只需按Ctrl+h(或点击项目栏中的对象属性,图标就像盾牌)。

然后转到:

编译器>链接器>生成调试信息(-g3)

并将其设置为“否”。

只需使用 devc++ 并享受!

【讨论】:

    【解决方案2】:

    如果您只需要 gpsvc.dll 的 32 位副本,您可以尝试从实际的 32 位版本的 Windows 获取它,然后将它与您的应用程序使用的所有其他 dll 一起放置。但是,它是 Windows 提供的 dll,所以我不认为你真的应该这样做,而且它可能最终无法正常工作。也就是说,64 位 Windows 可能会注意到这一点,并且不允许您加载 DLL。

    至于构建“发布 exe”,我认为 Dev C++ 不像 Visual Studio 和许多其他 IDE 那样具有发布或调试构建配置的概念。您可以做的是转到项目选项,然后是编译器选项卡,然后是下面列表中的链接器标题。如果“生成调试信息”设置为“是”,请将其更改为“否”。如果需要,您还可以将“Strip Executable”设置为“Yes”,以及在“Linker”下方的“Optimization”标题下打开各种优化设置。

    或者,您可以使用 Dev C++ 自动生成的 makefile 并对其进行修改,将其保存为不同的文件名,例如“my_project_release.win”。你要做的是改变它以删除命令行开关,如 -g、-g3 或其他类似的标志,这些标志允许在编译的二进制文件中包含调试信息。要从编译后的二进制文件中去除符号,请将 -s 添加到 CXXFLAGS 和 CFLAGS 生成文件变量中,方法与从生成文件中删除调试信息标志的方式相同。创建这个新的 makefile 后,再次进入 Project Options 对话框,然后转到 Makefile 选项卡。选中“使用自定义 Makefile...”,然后在此处指定此新 makefile 的位置,您现在应该正在构建可执行文件的发布版本。要切换回 Debug 转换,请将 makefile 行更改为指向具有指定调试设置的 makefile 的原始副本。

    【讨论】:

    • 我尝试将项目移动到 Visual c++ 2010 express 并以发布模式构建,但在另一台计算机上的结果是相同的。我也试过在项目选项中使用各种调试和优化选项,在另一台计算机上仍然有相同的结果。
    • 您是否尝试过将 exe 和 dll 移动到远离 USB 驱动器的实际计算机上的文件夹中?我想知道计算机是否有某种权限策略可以阻止从 USB 闪存驱动器等可移动媒体运行程序。您还想查看程序的代码是显式地还是隐式地加载 DLL(如果它有 LoadLibrary 或 LoadLibraryEx 调用,它是显式的)。如果它使用显式加载,它可能只是由于程序逻辑静默而失败。根据我的经验,隐式链接失败通常会导致 Windows 指示无法加载哪个 dll。
    • 是的,我也尝试将它移动到实际的计算机上,但结果是一样的。如何检查程序如何加载 dll?我在visual studio中设置吗?
    • 如果你只是使用函数调用,因为它们出现在 dll 的头文件中,它是隐式加载。例如如果 foo.dll 导出 void foo1(int);和 int foo2(void);而且您直接调用 foo1 和 foo2 ,它可能会进行隐式加载。如果您在代码中找到字符串“LoadLibrary”或“GetProcAddress”,则它是显式加载。如果可行,您可以做的是在目标计算机上运行 exe 的调试版本,并通过 Visual Studio 使用远程调试来尝试查看您的哪些 dll 正在加载(如果有)。这将在“调试”类别下的“输出”窗口中显示。
    • 所以如果它的显式加载可能是问题所在,那就是你在说什么?如果是这样,我应该采取什么措施来解决它?如果我在目标机器上的 VS 上运行调试模式,这意味着在目标机器上安装和设置 Visual Studio,根据我的经验,这将使目标机器与我的机器没有什么不同,它会工作。我可以看到哪些 dll 正在从我的机器加载,但我知道哪些 dll 用于 Visual Studio 和调试,哪些用于我的 exe。这让我进入了“依赖步行者”步行者部分。这让我看起来需要一个 32 位版本的 GPSVC.DLL
    猜你喜欢
    • 2020-12-11
    • 2010-10-19
    • 2011-11-28
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多