[問題] 跨 DLL 的問題

看板C_and_CPP作者 (CA)時間16年前 (2009/04/02 10:08), 編輯推噓8(8026)
留言34則, 4人參與, 最新討論串1/3 (看更多)
剛剛重新翻了一下 C++ Coding Standard 裡面有一條是說,在模組邊界如果使用std::string 等class的話,會導致跟它接的模組也要用同一個實作品 用相同選項編譯,因此若為了可攜性要盡量使用低階型別 但是它又鼓勵使用如std::tr1::shared_ptr的資源管理物件 來傳遞給其他DLL,這不就代表客戶也必須要使用同一份實作? 是否這是在"可攜性"和"正確刪除物件"之間的取捨? -- 自High筆記(半荒廢) http://legnaleurc.blogspot.com/ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.146.194.91

04/02 22:46, , 1F
你前四句話應該就是我曾遇到過的CRT問題。
04/02 22:46, 1F

04/02 22:47, , 2F
就是一個DLL它如果有call C++ standard libraries,
04/02 22:47, 2F

04/02 22:49, , 3F
那這DLL在給別的程式使用時,別的程式必須用compile該DLL的
04/02 22:49, 3F

04/02 22:49, , 4F
compiler編譯。
04/02 22:49, 4F

04/02 22:51, , 5F
比如說一個DLL有用到C++ standard libraries且用VC2005編繹。
04/02 22:51, 5F

04/02 22:52, , 6F
如果另外一個程式想使用該DLL,那這程式必須用VC2005編。
04/02 22:52, 6F

04/02 22:54, , 7F
如果你想用VC2008編,就會在執行的時候出現錯誤。
04/02 22:54, 7F

04/02 22:56, , 8F
會這樣啊!那怎麼解決?
04/02 22:56, 8F

04/02 22:56, , 9F
這也就是我之前說過的,各家的C++編譯器編出來的東西往往不
04/02 22:56, 9F

04/02 22:57, , 10F
相容。甚至(我確定的)微軟自家的編譯器不同版本編出的東西也
04/02 22:57, 10F

04/02 22:57, , 11F
有相容性問題。
04/02 22:57, 11F

04/02 23:00, , 12F
一個解決的方法是把該DLL的原始檔重新用一樣的編譯器編譯。
04/02 23:00, 12F

04/02 23:02, , 13F
對不起,我好像記錯了。好像是static libraries才會有此問題
04/02 23:02, 13F

04/02 23:04, , 14F
如果我沒記錯的話DLL反而可以避開CRT不相容的問題。
04/02 23:04, 14F

04/02 23:08, , 15F
我的做法是把stl包裝成handle另外處理
04/02 23:08, 15F

04/02 23:09, , 16F
抱歉,能不能避開的言論我先保留。改天我找到我當初在MSDN看
04/02 23:09, 16F

04/02 23:09, , 17F
除非標頭檔本身就有template,而不是stl
04/02 23:09, 17F

04/02 23:09, , 18F
到的那一篇,再下結論。
04/02 23:09, 18F

04/02 23:16, , 19F
找到了,是這篇文章:#18c1nP2a
04/02 23:16, 19F

04/02 23:18, , 20F
C++ ABI沒統一啊,所以library都要用同一個compiler編
04/02 23:18, 20F

04/02 23:18, , 21F
所以是DLL有相容性的問題。
04/02 23:18, 21F

04/02 23:23, , 22F
LS大,MinGW就是一個迷(惑)人的產物。它似乎可以link MSVC的
04/02 23:23, 22F

04/02 23:25, , 23F
C++ libraries。讓人以為MSVC也可以去link MinGW的C++ lib。
04/02 23:25, 23F

04/02 23:28, , 24F
抱歉,我上面兩行又說錯話,應該是C lib才對 XD
04/02 23:28, 24F

04/02 23:30, , 25F
但實際上,MSVC在呼叫MinGW C libraries在某些情下會出錯。
04/02 23:30, 25F

04/02 23:34, , 26F
這是因為MSVC與MinGW的C libraries雖然signature格式一樣,
04/02 23:34, 26F

04/02 23:35, , 27F
但function call對stack操作的方式不太一樣。
04/02 23:35, 27F

04/02 23:38, , 28F
所以結論就是,用libraries較保險的作法就是不要用不同
04/02 23:38, 28F

04/02 23:39, , 29F
compiler編出來的東西。不過講坦白的,source code有時也不
04/02 23:39, 29F

04/02 23:40, , 30F
能完美的跨compiler。我之前就改過一支程式,原先它是用
04/02 23:40, 30F

04/02 23:41, , 31F
Dev C++ (MinGW)開發的,後來拿到VC上編就掛了。
04/02 23:41, 31F

04/02 23:42, , 32F
後來才知道VC不支援C99標準。
04/02 23:42, 32F

04/02 23:48, , 33F
不過LS大說的正確,C++ compilers連signatures都不同了,
04/02 23:48, 33F

04/02 23:48, , 34F
linking time就不會過了。
04/02 23:48, 34F
文章代碼(AID): #19r8wNcA (C_and_CPP)
討論串 (同標題文章)
以下文章回應了本文
完整討論串 (本文為第 1 之 3 篇):
問題
8
34
文章代碼(AID): #19r8wNcA (C_and_CPP)