2011-09-28 137 views
1

我目前正在試圖找出是否有可能爲兩個不同的本機Visual-C++項目(具有完全相同的編譯器設置)分享他們的中間文件(OBJ,PCH,...)在C++項目之間共享中間文件?

一個例子應該有所幫助:

這是一個正常的設置:

PROJECTS \ P1 \ p1.vcproj; p1.cpp; ... 
       \ Release_Intermediate_Dir \ p1.obj 
             \ tool1.obj 
     \ P2 \ p2.vcproj; p2.cpp; ... 
       \ Release_Intermediate_Dir \ p2.obj 
             \ tool1.obj 
     \ COMMON \ tool1.cpp; ... 

這個怎麼樣設置:

PROJECTS \ P1 \ p1.vcproj (uses: p1.cpp; p1_main.cpp) 
       \ p1_test.vcproj (uses: p1.cpp; p1_test.cpp) 
       \ Release_Intermediate_Dir \ p1.obj  (used by both projects p1 and test) 
             \ tool1.obj 
             \ p1_main.obj (only p1.vcproj) 
             \ p1_test.obj (only p1_test.vcproj 
     \ COMMON \ tool1.cpp; ... 

我可以在兩個C++項目中使用相同的中間文件夾,從而直接共享obj文件嗎?

或者我會一直需要一個額外的靜態lib項目? (據我瞭解,靜態庫是just a containerobj文件。)


我爲什麼要這麼做?看看這個博客文章:Writing Unit Tests in Visual Studio for Native C++

它使用一個靜態庫爲了有兩個不同的可執行文件(主要功能,如果你願意)的唯一目的。 (忘記託管/ CLI的東西。)這意味着在你的解決方案中有3個項目(必須維護三個項目),當你真的只想要兩個項目共享相同的編碼設置,但使用不同的主/啓動索具。

回答

1

通過爲兩個項目強制執行相同的編譯標誌並使項目的中間體成爲項目B的先決條件,可以從B中移除所有的自由度。單獨編譯B並且您的鏈接建議B具有可能性除了測試A之外沒有任何理由。最簡單和最乾淨的解決方案是將B測試合併到A中,並將整個項目合併到一個項目中(坦率地說)。

在automake的說法中,你需要將B中的單元測試聲明爲check_PROGRAMS,它們只會被編譯來檢查你的程序。我不是Visual-C++專家,但這是乾淨的解決方案,應該用VC++來完成。

附錄:澄清automake的說法,一個項目將有例如像:

noinst_LTLIBRARIES = libthings-to-test.la libthings-not-tested.la 
bin_PROGRAMS = production 
check_PROGRAMS = unit_test_a 

production_SOURCES = main.cpp 
production_LDADD = libthings-to-test.la libthings-not-tested.la 
unit_test_a_SOURCES = test.cpp 
unit_test_a_LDADD = libthings-to-test.la 
libthings_to_test_la_SOURCES = foo.cpp bar.cpp baz.cpp 

在一個項目中的全部代碼庫(生產代碼,公共庫,測試),即一個單元,其完整配置和分發,並附有單一版本號。當由最終用戶/分銷商安裝時,單個程序​​將被鏈接。使用make all進行編譯時,便利庫和必要對象將編譯到構建目錄中,並且當調用make check時,將僅編譯單元測試所需的對象,並鏈接生產代碼並運行測試。再次,我很抱歉,我無法將其轉換爲Microsoft Speak。

+0

其實它更多的是對稱關係恕我直言。兩個項目都共享代碼。 (相同的編譯工件。)但鏈接器將鏈接每個不同的東西。我對automake並不熟悉:您可以添加指向您所指的功能的鏈接嗎? –

+0

我很想去,但恐怕automake手冊不是那麼具體。我已經添加了一個例子,它將如何在automake中解決。 – thiton