【问题标题】:Cross-platform development?跨平台开发?
【发布时间】:2010-11-29 06:32:00
【问题描述】:

我正在寻找一种允许我使用 C++ 为 Linux 和 Windows 编写代码的解决方案。

在 Windows 上,我使用 Visual Studio(我在 Windows 上尝试了其他东西,但我使用 DirectX,据我所知,这是最好的解决方案)。

在 Linux 上,我使用 NetBeans(我非常喜欢)。

我的问题是我希望项目独立于 Visual Studio 和 NetBeans。

有一段时间我认为CMake 是解决方案,但是学习过程太重要了,我宁愿把时间花在编码上,也不愿花时间学习 CMake 的所有技巧。所以我选择了Boost.Jam。它在 Linux 上运行良好,但在 Visual Studio 上运行不佳。

我在 Windows 上创建了一个小型 Hello World 程序。我创建了一个 Visual Studio Makefile 项目,并且它正在正确编译和链接。我可以运行可执行文件,但不能从 Visual Studio 运行,它找不到可执行文件(无论我做什么)。我也无法调试。当我得到一个时,我也看不到编译错误消息。从 Visual Studio 中我所能看到的只是一个 makefile 操作正在进行中并且有一个错误(即使程序已创建并运行良好)。

我浏览 Boost.Jam 文档已经有一段时间了,但让我们面对现实吧,它很差(难怪没有很多人听说过)或者我很不适合这份工作(意思是愚蠢的哈哈但是为什么很少有人听说过)。

我有三个问题:

我想知道是否有人听说过将 Boost.Jam 与 Visual Studio 结合使用的项目?如果是,我可以看看吗?

是否有与真正的 Visual Studio 集成的工具?

有多少人认为学习(正确地)使用 CMake 需要花费大量时间?有什么加速技巧吗?

【问题讨论】:

    标签: c++ visual-studio-2008 boost cross-platform cmake


    【解决方案1】:

    您应该花时间学习 CMake 并加快学习过程购买/阅读 "Mastering CMake 4th Edition"

    如果您遇到问题,您应该使用 CMake mailing list,它处于活动状态(2009 年 8 月有大约 600 条消息)

    【讨论】:

    • 嗨,我认为你是对的。在我写完这个问题后,我在 CMake 上更加努力,坦率地说,我什至不知道我为什么要去提升构建哈哈。也谢谢你的书,我想我会去的。感谢您的回复。
    【解决方案2】:

    Qt 和 Qt Creator 看起来是解决您问题的好方法。 qmake 可以生成 vcproj 文件和原生 Linux makefile。

    【讨论】:

    • 感谢您的回复。即使我喜欢这个项目的 QT,我也不能使用它。但我不知道 QT 创建者(QT 已经有一段时间了)。正如我上面所说的,CMake 没问题。
    【解决方案3】:

    如果我要为 Windows 和 linux 编写 C++ 代码,我会为 linux 编写代码,并将应用程序与最小的 cygwin 设置捆绑在一起。

    【讨论】:

    • +1,为 linux 编写并使用 mingw 或 cygwin 似乎是最简单的,特别是因为像 pthreads 这样的东西现在(相对)是可移植的。由于openssl,套接字也很容易跨平台编写。你基本上必须在他们自己的类中实现特定于系统的东西,并编写一个从构建中排除相关内容的 makefile - 但如果你做得聪明并检查跨平台库(pthreads/openssl 只是两个例子)你'将编写很少的系统特定类
    • 我不会投反对票,但是为Linux编写代码并使用Cygwin并不是真正的跨平台编程,它只是方便程序员。
    • 此外,将 Cygwin 与您的应用程序捆绑在一起需要您根据 GPL 兼容的许可证发布您的应用程序,除非您拥有商业 Cygwin 许可证。
    • 感谢您的回复。但是我不认为这是一个真正的解决方案。就像我之前说过的,我想在 Windows 上使用 DirectX,即使 minGW 或 cinGW 可以做到。 cl 可以做得更好,也让我的生活更轻松。我宁愿专注于我的代码,也不愿花时间解决这类问题。
    • Xilinx 将此策略用于其 FPGA 综合工具。一切都是为 Linux 编写的(甚至是 GUI),并与 Windows 的 cygwin 设置打包在一起。问题是它在 Windows 上确实非常不稳定,经常崩溃,并且对较新操作系统(即 Win 7)的支持不可避免地落后了,因为您必须等待 cygwin 支持它才能支持它。虽然这可行,但恕我直言,这不是最好的方法。
    【解决方案4】:

    您确定您正在查看正确的文档吗?你说过“Boost.Jam”,所以你看错东西的机会很高。请访问Boost.Build documentation

    我确信很多人在 Visual Studio 中使用 Boost.Build 时都没有问题。您可以尝试在命令行上运行该程序吗?也许有一些 Visual Studio 决定不显示的错误消息?

    【讨论】:

    • 是的,我正在查看 boost.build。只是 boost.build 代表了 bjam 用于构建软件的所有配置文件,这就是我将两者混合的原因。感谢您提供有关将其与 VS 一起使用的信息,但是您在哪里可以查看?干杯
    • 我建议您在 boost-build@lists.boost.org 上提问。请务必详细描述您的问题。
    【解决方案5】:

    我也推荐 CMake。一开始有点吓人,但你会逐渐适应它。初学者编写跨平台脚本仍然相当容易,即使它们不像专家那样漂亮或最佳。与 CppUnit(用于单元测试)和 Hudson(构建 mgt)的集成使得可以立即配置持续集成框架。

    【讨论】:

      【解决方案6】:

      我对 NetBeans 了解不多,但如果您想同时为 Windows 和 Linux 进行开发并在 Windows 上使用 Visual Studio,那么 CMake 是唯一明智的选择,真的。我已经使用它好几年了,我无法猜测它为我维护 makefile 和项目文件节省了多少时间。

      【讨论】:

        【解决方案7】:

        为本投票。我们有一个主要的供应商,他们将他们的旧 Unix 代码移植到 Windows 上以用于商品硬件访问,而这正是他们所做的。

        Emacs 在两个平台上都能正常工作,GNU 也一样。如果您需要 GUI,我会使用带有 MinGW/msys 的 GTK+,而不是 Cygnus 和 X 端口。

        【讨论】:

        • 在这种情况下它工作正常,而不是在我的。感谢您的回复。
        【解决方案8】:

        几个月前我在 Fosdem 看过一个 CMake 演示,它看起来非常令人印象深刻。我认为花时间学习它可能是值得的。

        另一方面,根据我的个人经验,为每个平台维护单独的项目文件是一种完全可以接受的做事方式。

        【讨论】:

          【解决方案9】:

          使用 CMake 进行交叉编译唯一重要的事情是编写工具链信息:CMake 会计算出其余部分。请参阅http://www.cmake.org/Wiki/CMake_Cross_Compiling#The_toolchain_file 了解更多信息。

          【讨论】:

            【解决方案10】:

            我不知道你想要多复杂,我在 linux 上使用 mingw-4.4.2 + cmake 为 Windows 编译我的 Qt4 应用程序,并在 wine 上使用 NSIS 来创建设置文件。 基本上,当我通过 -DWin32=1 时,我破解了我的 CMakeLists.txt 以使用 mingw。 这是相关部分:

            if(WIN32) 
                SET(CMAKE_BUILD_TYPE "Release") #force release for win32, no motive to debug on win32
            
                SET(CMAKE_CXX_FLAGS_RELEASE  "-march=pentium4 -mtune=pentium4 -mwindows -DNDEBUG -mno-align-stringops -minline-stringops-dynamically -fno-ident -freorder-blocks-and-partition -finline-limit=700 -mfpmath=sse  -ftree-loop-distribution -floop-block -floop-interchange -floop-strip-mine -findirect-inlining -ftree-switch-conversion ${BASE_CXX_FLAGS}")
            
                SET(WIN32_BASE /home/win32-devel)
                SET(QT_LIB ${WIN32_BASE}/qt-win-opensource-src-4.5.3/lib/)
            
                SET(CMAKE_CXX_COMPILER i686-pc-mingw32-g++)
                SET(CMAKE_AR i686-pc-mingw32-ar)
                SET(CMAKE_RANLIB  i686-pc-mingw32-ranlib)
                SET(CMAKE_LINKER i686-pc-mingw32-ld)
            
                ADD_CUSTOM_COMMAND( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/app_icon.o
                                    COMMAND i686-pc-mingw32-windres
                                        -I${CMAKE_CURRENT_SOURCE_DIR}
                                        -o${CMAKE_CURRENT_BINARY_DIR}/app_icon.o
                                        -i${CMAKE_CURRENT_SOURCE_DIR}/icons/win32_icon.rc
                                    )
            
                SET(OPENSSL_LIBRARIES  ${WIN32_BASE}/openssl-0.9.8l/libeay32.dll;${WIN32_BASE}/openssl-0.9.8l/libssl32.dll)
                SET(QT_LIBRARIES  ${QT_LIB}QtCore4.dll;${QT_LIB}/QtGui4.dll)
                SET(CMAKE_EXECUTABLE_SUFFIX ".exe")
            
                include_directories(${CMAKE_CURRENT_BINARY_DIR} ${QT_LIB}../include ${WIN32_BASE}/openssl-0.9.8l/include)
                message("Building For   : Win32")
            else()
                include_directories(${CMAKE_CURRENT_BINARY_DIR} ${QT_INCLUDES} ${OPENSSL_INCLUDE_DIR})
                message("Building For   : Linux")
            endif()
            SET(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "-Wl,--no-undefined -static-libgcc -Wl,-O1 -Wl,--as-needed -Wl,--sort-common -s")
            

            编辑: 忘了说实际开发是使用 KDevelop 4 完成的。

            【讨论】:

              【解决方案11】:

              MPC,“Makefile、Project 和 Workspace Creator”是另一个可能对您有用的工具。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多