看板 C_and_CPP 關於我們 聯絡資訊
剛剛重新翻了一下 C++ Coding Standard 裡面有一條是說,在模組邊界如果使用std::string 等class的話,會導致跟它接的模組也要用同一個實作品 用相同選項編譯,因此若為了可攜性要盡量使用低階型別 但是它又鼓勵使用如std::tr1::shared_ptr的資源管理物件 來傳遞給其他DLL,這不就代表客戶也必須要使用同一份實作? 是否這是在"可攜性"和"正確刪除物件"之間的取捨? -- 自High筆記(半荒廢) http://legnaleurc.blogspot.com/ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.146.194.91
zxvc:你前四句話應該就是我曾遇到過的CRT問題。 04/02 22:46
zxvc:就是一個DLL它如果有call C++ standard libraries, 04/02 22:47
zxvc:那這DLL在給別的程式使用時,別的程式必須用compile該DLL的 04/02 22:49
zxvc:compiler編譯。 04/02 22:49
zxvc:比如說一個DLL有用到C++ standard libraries且用VC2005編繹。 04/02 22:51
zxvc:如果另外一個程式想使用該DLL,那這程式必須用VC2005編。 04/02 22:52
zxvc:如果你想用VC2008編,就會在執行的時候出現錯誤。 04/02 22:54
tsaiminghan:會這樣啊!那怎麼解決? 04/02 22:56
zxvc:這也就是我之前說過的,各家的C++編譯器編出來的東西往往不 04/02 22:56
zxvc:相容。甚至(我確定的)微軟自家的編譯器不同版本編出的東西也 04/02 22:57
zxvc:有相容性問題。 04/02 22:57
zxvc:一個解決的方法是把該DLL的原始檔重新用一樣的編譯器編譯。 04/02 23:00
zxvc:對不起,我好像記錯了。好像是static libraries才會有此問題 04/02 23:02
zxvc:如果我沒記錯的話DLL反而可以避開CRT不相容的問題。 04/02 23:04
sunneo:我的做法是把stl包裝成handle另外處理 04/02 23:08
zxvc:抱歉,能不能避開的言論我先保留。改天我找到我當初在MSDN看 04/02 23:09
sunneo:除非標頭檔本身就有template,而不是stl 04/02 23:09
zxvc:到的那一篇,再下結論。 04/02 23:09
zxvc:找到了,是這篇文章:#18c1nP2a 04/02 23:16
littleshan:C++ ABI沒統一啊,所以library都要用同一個compiler編 04/02 23:18
zxvc:所以是DLL有相容性的問題。 04/02 23:18
zxvc:LS大,MinGW就是一個迷(惑)人的產物。它似乎可以link MSVC的 04/02 23:23
zxvc:C++ libraries。讓人以為MSVC也可以去link MinGW的C++ lib。 04/02 23:25
zxvc:抱歉,我上面兩行又說錯話,應該是C lib才對 XD 04/02 23:28
zxvc:但實際上,MSVC在呼叫MinGW C libraries在某些情下會出錯。 04/02 23:30
zxvc:這是因為MSVC與MinGW的C libraries雖然signature格式一樣, 04/02 23:34
zxvc:但function call對stack操作的方式不太一樣。 04/02 23:35
zxvc:所以結論就是,用libraries較保險的作法就是不要用不同 04/02 23:38
zxvc:compiler編出來的東西。不過講坦白的,source code有時也不 04/02 23:39
zxvc:能完美的跨compiler。我之前就改過一支程式,原先它是用 04/02 23:40
zxvc:Dev C++ (MinGW)開發的,後來拿到VC上編就掛了。 04/02 23:41
zxvc:後來才知道VC不支援C99標準。 04/02 23:42
zxvc:不過LS大說的正確,C++ compilers連signatures都不同了, 04/02 23:48
zxvc:linking time就不會過了。 04/02 23:48