跨平台开发?

时间:2009-09-17 19:06:56

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

我正在寻找一种解决方案,允许我使用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(正确)会耗费大量时间?加速的任何技巧?

11 个答案:

答案 0 :(得分:12)

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

如果您遇到问题,请使用活动的mailing list {2009年8月有~600条消息

答案 1 :(得分:5)

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

答案 2 :(得分:4)

如果我使用C ++ for Windows和linux进行编码,我会为linux编写代码,并使用最小的cygwin设置捆绑应用程序。

答案 3 :(得分:3)

您确定要查看正确的文档吗?你说过“Boost.Jam”,所以很有可能你看错了。请访问Boost.Build documentation

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

答案 4 :(得分:3)

我也推荐CMake。起初它有点可怕,但你逐渐放松它。对于初学者来说,编写跨平台脚本仍然相当容易,即使它们不像专家那样漂亮或最优。与CppUnit(用于单元测试)和Hudson(构建mgt)集成使得可以立即配置持续集成框架。

答案 5 :(得分:2)

我对NetBeans知之甚少,但是如果你想为Windows和Linux开发并在Windows上使用Visual Studio,那么 CMake是唯一理智的选择。我已经使用它好几年了,而且我无法猜测它节省了多少时间来维护makefile和项目文件。

答案 6 :(得分:1)

为本命望。我们有一个主要的供应商为他们的商用硬件访问做了旧的Unix代码的Windows端口,这正是他们所做的。

Emacs在两个平台上运行良好,GNU make也是如此。如果你需要一个GUI,我会使用带有MinGW/msys的GTK +而不是Cygnus和一个X端口。

答案 7 :(得分:1)

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

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

答案 8 :(得分:1)

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

答案 9 :(得分:1)

我不知道你想要多么复杂,我在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完成的。

答案 10 :(得分:1)

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