【问题标题】:What should expericenced Unix programmer to be aware of using Microsoft Tools?经验丰富的 Unix 程序员使用 Microsoft 工具应该注意什么?
【发布时间】:2011-01-09 20:26:45
【问题描述】:

我来自 UNIX 世界,我对 Linux、Solaris、Cygwin 非常熟悉 和 MinGW 开发。最近我移植了我的一个 支持 MSVC 的大项目 (cppcms), 包括使用 CMake 构建静态和动态库。

而且我总是遇到非常奇怪的问题:

  1. 我有CMake build issues 因为Windows 编程 lacks naming convention 用于导入和静态库。
  2. 现在我发现我应该根据 我做的实际构建(调试/RelWithDebInfo - 应该使用调试 ICU,发布版本 ICU),所以我应该 根据 MSVC 下的调试/发布模式更改搜索库的实际约定。 否则应用程序将不会开始在缺少 DLL 时给出错误。

    在使用 GCC 的 Mingw 或 Cygwin、使用 Sun Studio 的 Open Solaris 或使用 gcc 或 intel 编译器的 Linux 下,我没有任何此类问题。

  3. 我仍然有很多有线问题和有线错误以及非常奇怪的行为——即使是一些微不足道的事情也不起作用 在 MSVC 构建下,当在 Solaris/Linux/Cygwin/Mingw 下使用 3.4 到 4.4 的 GCC 一切正常时, Sun Studio 和 Intel 编译器)。但不在 MSVC 下。

    说实话,我不知道如何处理最后一个!因为在我看来它更像是环境问题。

我知道这个问题并没有很好地定义。我觉得我很有经验 开发人员和我知道如何编写可移植且良好的 C++ 代码。但是使用 Microsoft native 工具让我对我不知道如何解决的问题发疯。

问题:经验丰富的 Unix 程序员在 Win32 API 基础上应该知道什么时候 开始使用正版 Microsoft 工具?

P.S.:有人能解释一下为什么“带有调试信息的发布”需要调试版本的 MSVC 运行时吗?为什么存在两个版本的runtime

P.P.S.:请注意,我对 Win32 API 没有问题,实际上 Windows GCC 构建工作绝对正常。

说明:

我正在寻找来自 Unix 世界的程序员可能会陷入的陷阱。

例如,从 Linux 迁移到 Solaris:确保使用 -mt-pthreads 使用多线程程序时,用 -lpthread 链接是不够的。

【问题讨论】:

  • 我使用 Microsoft Visual Studio 2008 Express Edition(免费版)我没有钱购买完整版,尤其是开源项目。
  • 没有什么特别要知道的。两者都会因为不同的原因让你发疯......
  • 什么是有线错误和有线问题?
  • 我的意思是普通代码无法与所有其他编译器/平台一起使用。程序有时会在简单的任务上崩溃。难以解释。需要深入调试...
  • 您的意思可能是“怪异”,而不是“有线”?!如有请更正。

标签: unix winapi build visual-c++ cmake


【解决方案1】:

P.S.:有人能解释一下为什么“发布 带有调试信息”需要调试 MSVC 运行时版本?

没有。

为什么会有 是否存在两个版本的运行时?

因为调试版本做了更多的错误检查。

我还有很多有线问题 和有线错误,非常奇怪 行为——甚至是一些琐碎的事情 不适用于 MSVC 版本,

* What am I doing wrong?

没有告诉我们你得到了什么“有线问题和有线错误以及非常奇怪的行为

* Where should I start?

通过告诉我们您遇到的具体错误和问题。

* What do I miss?

阅读文档并学习工具。

如果您的问题是“我应该阅读哪些内容才能成为一名优秀的 Windows 程序员?”那么我的回答是:一切从Jeff Richter开始。

【讨论】:

  • 当然我不要求在我的项目中查找错误...除非您愿意下载并帮助我;-)。这些问题是相当修辞的。主要问题如下:Win32 API 基础相当好的经验丰富的 Unix 程序员应该知道什么时候开始使用 Genuine Microsoft Tools?
  • @Alex “有人可以解释...运行时吗?它没有。”它确实如此,默认情况下,CMake 为 RelWithDebInfo 构建类型的链接器提供 /debug 标志......所以它确实如此。
  • @Artyom,“它没有。”它确实”。不,它没有。/debug 并不意味着你认为它的意思。
  • 对不起...如果是这样...(哭着把头伸到屏幕上)我真的不知道如何使用 Microsoft 工具。
  • @Artyom:恭喜你承认自己的无知。这是一个好的开始。现在问一些具体的问题,你的无知就会得到解脱。
【解决方案2】:

没有灵丹妙药可以自动使您成为经验丰富的 Windows 开发人员。与 Unix 相比,Windows 是一个非常不同的领域。有很多怪癖、奇怪的行为和简单的不同的东西。保持清醒的唯一方法是一次解决一个小问题。专注于特定问题并尝试理解该问题。不要只是“让它发挥作用”,而是要真正了解正在发生的事情。一本关于 Windows 编程的好书会有所帮助。

SO 社区积累了大量的 Windows 知识和经验,但获取这些知识和经验的唯一方法是就具体问题提出具体问题。 p>

【讨论】:

    【解决方案3】:

    DLL 的发布和调试版本使用不同的内存分配方式,这就是为什么不建议混合发布和调试版本的原因。如果您在调试模式 DLL 中分配某些内容并将其传递回在发布模式下编译的应用程序,您可能会遇到麻烦。

    在您的命名问题的情况下,您可能希望有不同的目录来放置您的静态/dll。您可以使用配置管理器在 Visual Studio 中执行此操作,但不确定它在 express 版本下如何。

    【讨论】:

    • 这也与静态构建有关吗? (例如我使用的 zlib)
    • 最好不要混用;如果您在调试模式下编译静态库,它将使用运行时 dll 的调试版本,如果将其传递给处于发布模式的主应用程序,您可能会遇到问题 - 我在这里说“可能”,因为可能会有例外。
    • 那么当我有 4-5 个第 3 部分库(如 ICU、Boost、Zlib 甚至更多)时,我该如何配置它们???
    • 您确保在构建调试二进制文件时链接到第 3 方库的调试版本,反之亦然。确实没有办法绕过这样一个事实,即有两组运行时库并且它们必须匹配。
    【解决方案4】:

    我认为您需要尝试并真正理解新工具集,而不是仅仅尝试将其压缩到您当前对现有工具的理解中。为此,恕我直言,最好的方法是让您尝试并开始按照 Microsoft 的意图使用 Visual Studio,然后一旦您可以在 IDE 中构建一个简单的项目,您就可以使用您喜欢的 make 系统来构建它,但是这样做了解 IDE 如何使用其 make 系统为该构建进行设置(这将起作用)。

    因此,例如,对于问题的第 1 部分,您想要创建一个简单的静态库项目和一个简单的 dll 项目并查看链接器选项选项卡。跳转到“命令行”视图,您会看到 DLL 使用 /OUT 链接器选项设置 dll 文件的名称和位置,并使用 /LIB 链接器选项设置导入库的名称和位置。对于静态库,仅使用 /OUT 选项,它指示静态库的名称。确实,如果您从同一源构建静态库和 DLL,并且将 dll 的 /LIB 设置为 MyCrossPlatformCode.lib 并将 /OUT 设置为 MyCrossPlatformCode.dll,那么如果您还构建,则可能会遇到问题带有 MyCrossPlatformCode.lib 的 /OUT 开关的静态库...不要那样做;要么将静态库构建到不同的输出目录(这是 OpenSSL 所做的),或者更好(恕我直言),稍微修改名称,以便您拥有 MyCrossPlatformCode.lib/.dll 和 MyCrossPlatformCode_static.lib(这是 STLPort 所做的) .

    请注意,您可能还想参与(或考虑)使用不同版本的 Microsoft 工具链进行构建(因此您最终可能会得到 stlport_vc8_x64d_static.5.1)。

    如果您真的无法理解自己的工具集,另一种方法是,您可以查看一些在 Windows 和 Unix 系统上构建良好的流行开源系统; OpenSSL 和 STLPort 可能是一个开始。

    【讨论】:

    • 我知道如何构建静态和动态库。我很惊讶在所有其他平台上都没有符号约定:见stackoverflow.com/questions/2140129/…。也不能按原样使用IDE。我使用跨平台构建系统 (CMake),我将无法为每个编译器/平台提供单独的构建系统,因为我不为 GCC、SunCC 或 Intel Compiler for Solaris、Linux、BSD、 Cygwin 或 Mingw。
    • 我建议您使用 IDE 来了解工具集;如果您选择零成本的速成版。您暗示您不想了解该工具集。这是你的选择,但如果你这样做,你会做出更好的作品。正如我所解释的,其他项目管理得很好。他们中最好的为每个平台提供构建,就像你期望每个构建都工作一样,如果你是那个平台的本地人。这通常是通过让不同的人完全理解每个平台的习语或愿意学习它们的人来实现的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    相关资源
    最近更新 更多