什么应该让Unix程序员知道使用Microsoft Tools?

时间:2010-01-27 07:29:42

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

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

我总是得到绝对奇怪的问题:

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

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

  3. 我仍有许多有线问题和有线错误以及非常奇怪的行为 - 即使是一些微不足道的事情也行不通 在MSVC版本下,当Solaris / Linux / Cygwin / Mingw在使用GCC从3.4到4.4的情况下一切正常时, Sun Studio和英特尔编译器)。但不是在MSVC下。

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

  4. 我知道问题的定义并不是很明确。我觉得我很有经验 开发人员和我知道如何编写可移植的和良好的C ++代码。但使用Microsoft native 工具让我疯狂的问题我只是不知道如何解决。

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

    P.S。:有人可以解释为什么“Release With Debug Info”需要调试版本的MSVC运行时?为什么存在两个版本的运行时

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

    澄清:

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

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

4 个答案:

答案 0 :(得分:6)

  

P.S。:有人可以解释为什么“释放   使用Debug Info“需要调试   MSVC运行时的版本?

没有。

  

为什么那里   存在两个版本的运行时?

因为调试版本会进行更多的错误检查。

  

我仍有许多有线问题   和有线的错误,非常奇怪   行为 - 甚至是一些微不足道的事情   不能在MSVC版本下工作,

* What am I doing wrong?

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

* Where should I start?

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

* What do I miss?

阅读文档并学习工具。

如果你的问题是“我怎么读才能成为一名优秀的Windows程序员?”然后我的答案是:Jeff Richter的所有内容,作为开始。

答案 1 :(得分:2)

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

在SO社区中积累了大量的Windows知识和经验,但访问它的唯一方法是询问有关特定问题的具体问题。

答案 2 :(得分:1)

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

如果出现命名问题,您可能希望在其中放置static / dll的目录不同。您可以使用配置管理器在visual studio中执行此操作,但不确定它是否在快速版本下。

答案 3 :(得分:1)

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

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

请注意,您可能还希望使用不同版本的Microsoft工具链来破坏(或考虑)构建(因此您最终可能会使用stlport_vc8_x64d_static.5.1)。

如果您真的无法理解您的工具集,那么另一种方法是,您可以查看一些在Windows和Unix系统上构建得非常好的流行开源系统;也许是OpenSSL和STLPort的开始。