2009-09-17 232 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文件,項目和工作區創建者」完成的,是另一種工具,可以對你有用。