2017-03-08 84 views
0

我正在嘗試使用鏈接器開關「/ entry」爲visual C++可執行文件提供自己的入口點。相關的Microsoft文檔詳細介紹瞭如何在dll中手動初始化c運行時,但我無法掌握如何在我的exe中初始化它。我得到的最好的結果是我需要調用_CRT_init,但我不知道這是一個函數還是一個宏,或者它可能定義的位置,並且Visual Studio(和msbuild)不能識別標識符,所以那裏沒有提示。如何在exe中手動初始化c運行時?

這裏的基本原理是我試圖用谷歌測試單元測試一個可執行文件,它不會鏈接,因爲main()發生衝突。 GTest FAQ中提到的兩種方法並不是很通用,需要大量的重做才能實現大約30個遺留可執行文件。重命名每個單元測試應用程序的main()似乎是一個超級簡單的方法,只要我能初始化c運行時即可。

+1

Googletest不用於測試的可執行文件,它是用於測試 庫。用於測試某個庫的谷歌測試工具需要使用自己的可執行文件(具有自己的'main'功能)來執行此操作。 –

+0

顯然,我試圖通過鏈接或編譯從A代碼到GTest可執行文件B,而不是通過從B運行A或任何您認爲我正在執行的代碼來測試鏈接或編譯爲任意可執行文件A的代碼。請參閱[link](https://github.com/google/googletest/blob/master/googletest/docs/FAQ.md#how-do-i-test-a-file-that-defines-main)描述我面對的問題。我非常感謝你對你不知道答案的問題發表評論,並告訴提問者他們不知道他們在談論什麼。 – tyotypic

+0

如果您可以訪問運行時庫的源代碼,只是一個提示。 [MSDN](https://msdn.microsoft.com/en-us/library/abx4dbyh.aspx)說,初始化代碼應該是'libcmt.lib'。希望它有幫助... –

回答

0

所以我今天下午搜索了C運行時間源,答案是「否」。如果您想使用C運行時,則無法提供您自己的可執行入口點,該入口點未命名爲main。除了_CRT_INIT()是一個dll的初始化函數(mainCRTStartup()是可執行文件的初始化函數之一),mainCRTStartup()及其類似名稱的調用main()

0
  • 你可以在一個獨立的包裝模塊中初始化CRT,它具有 main; obj1
  • 將所有現有的exe模塊的主模塊重命名爲xx_main; OBJ2,OBJ3 .... objn
  • 鏈接OBJ1(主)(OBJ2,OBJ3 .... objn)

要測試一個foo.cc文件,你需要編譯並將其鏈接到您的單位 測試程序

什麼是這個方案的問題?

enter image description here

+0

這是GTest FAQ中的第一個建議,但更全球化。這裏唯一真正的問題是你必須以某種方式排除y.obj被鏈接到單元測試exe。完全可能,但稍微挑剔。 – tyotypic

+0

這裏y.c將是「單元測試exe」,而其他所有(x.c)將是其他模塊haing main()。想法是讓單元測試exe的代碼初始化CRT就像任何其他exe文件,然後讓所有其他「exe」模塊鏈接到它.. –

+0

但xc可執行文件都需要自己的'main()',否則CRT可以在正常執行過程中不會被初始化。 – tyotypic