2009-09-17 225 views
1

我正在寻找一种解决方案,可以让我使用C++编写Linux和Windows代码。我在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(正确)会花费大量时间?任何技巧加快?

回答

12

你应该花时间去学习CMake和加快学习过程中买入/读取"Mastering CMake 4th Edition"

如果你有问题,你应该使用CMake的mailing list,这是积极的(2009年8月曾〜600封邮件)

+0

嗨, 我认为你是对的。在我写下这个问题之后,我更加努力地在CMake上工作,坦率地说,我甚至不知道为什么我要提升构建大声笑。 也感谢这本书,我想我会为此而努力。 感谢您的回复。 – lollancf37 2009-09-19 13:35:10

4

如果我在C++中为Windows和Linux编写代码,我会为linux编写代码,然后用最小的cygwin安装程序捆绑应用程序。

+0

+1,写linux和使用MinGW的或Cygwin的似乎是最简单的,expecially因为像并行线程的(相对)便携现在。由于openssl,套接字也很容易编写跨平台。 你基本上必须实现系统特定的东西在自己的班级或写入从构建排除相关的东西,makefile文件 - 但是如果你做得巧妙,并检查跨平台库(并行线程/ OpenSSL的只是两个例子)你会写很少的系统特定的类 – laura 2009-09-18 08:19:57

+6

我不会downvote,但编写代码Linux和使用Cygwin不是真正的跨平台编程,它只是方便的程序员。 – rpg 2009-09-18 08:37:37

+3

另外,将Cygwin与您的应用程序捆绑在一起需要您以GPL兼容许可证发布您的应用程序,除非您有Cygwin商业许可证。 – JesperE 2009-09-19 07:15:38

1

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

与GNU make一样,Emacs在两个平台上都能正常工作。如果你需要一个图形用户界面,我会使用GTK +与MinGW/msys,而不是天鹅座和X端口。

+0

在这种情况下,它工作正常,不在我的。 感谢您的回复。 – lollancf37 2009-09-19 13:40:04

5

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

+0

感谢您的回复。 即使我喜欢这个项目的QT,我也无法使用它。但我不知道QT的创造者(QT已经有一段时间了)。 正如我上面说的CMake是没问题的。 – lollancf37 2009-09-19 13:39:26

3

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

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

+0

是的,我在看boost.build。这就是boost.build代表了bjam用来构建软件的所有配置文件,这就是为什么我混合了这两个文件。 感谢有关VS使用它的人的信息,但你在哪里我可以看看吗? 干杯 – lollancf37 2009-09-19 13:46:34

+0

我建议你询问[email protected]。一定要详细描述你的问题。 – 2009-09-25 05:32:15

2

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

+0

我知道你现在在这里,谢谢^^ – lollancf37 2009-09-19 13:43:00

3

我推荐CMake。起初有点可怕,但你可以逐步缓解。初学者编写跨平台脚本还是相当容易的,即使它们不像专家那样漂亮或者最优。与CppUnit(用于单元测试)和Hudson(build mgt)的集成使得可以立即配置持续集成框架。

1

几个月前我在Fosdem看过一个CMake demo,它看起来非常漂亮。我认为花时间学习它可能是值得的。

在另一方面,这是我个人的经验,保持每个平台单独的项目文件是一个做事的完全可以接受的。

1

我不知道你想变得多么复杂,我用MinGW的-4.4.2 + cmake的Linux上为Windows编译我的Qt4的应用程序,并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

1

MPC,“Makefile文件,项目和工作区创建者”完成的,是另一种工具,可以对你有用。