※ 引述《paulri8924 (ㄤㄤㄤ)》之銘言:
: 開發平台(Platform): (Ex: Win10, Linux, ...) Win 10
: 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) GCC
: 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) MSXML4.dll
: 問題(Question): 使用Code::Blocks整合開發環境下,我上網找了一個可以透過line notify傳訊息的程式
: 碼,然後安裝了msxml4,再將dll檔跟程式碼檔放在同一個資料夾,但編譯時出錯,不知
: 道錯在哪裡,小弟是新手,還請前輩解惑,謝謝!
: 餵入的資料(Input): 略
: 預期的正確結果(Expected Output): 能正確執行
: 錯誤結果(Wrong Output): 見影片檔
: 程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔) 見影片檔
: 補充說明(Supplement):
: 影片檔網址:https://www.youtube.com/watch?v=jaJZ_ph-Ub8
: → Lipraxde: 有中文字元的關係 04/13 23:00
: → paulri8924: 我剛剛將路徑改成全英文後還是不行耶@@ 狀況跟原本 04/13 23:09
: → paulri8924: 一樣 04/13 23:09
: → paulri8924: https://imgur.com/rY18hPF 04/13 23:13
: → Lipraxde: 程式碼裡也有出現中文字元 04/14 00:44
: → Lipraxde: 一定要輸出中文的話,檔案編碼、編譯選項要處理好 04/14 00:45
: 推 LPH66: 不對不對不對, 你哪裡學來 #import 的?! 04/14 02:21
: → LPH66: C++ 並沒有 #import 這種語法, 引入 dll 也不是這樣引入 04/14 02:22
: → LPH66: > Lipraxde 你可能被編譯訊息 stray xxx in program 搞混了 04/14 02:22
: → LPH66: 這裡原 PO 用的 #import 似乎被解釋成 #include 了 04/14 02:23
: → LPH66: 所以該 dll 的二進位內容被貼入原始檔內編譯造成這訊息 04/14 02:24
(因為查到了其他東西所以回文)
先提結論: 這個問題是誤用編譯器 extension 造成的問題
問題就是出在 #import 這東西上
C++ 標準沒有 #import 這東西, 不過因為這是 # 開頭的指示詞
只要編譯器讀得懂 # 後面的東西就可以做相應的操作
但因為這不是標準, 各家編譯器可以解釋成完全不一樣的東西:
https://stackoverflow.com/a/172264
* 在 MSVC 當中, #import 是用來引入一個 COM 介面
根據 MSDN↓, 它似乎真的能引入 .dll, 不過可能需要一些條件
https://docs.microsoft.com/zh-tw/cpp/preprocessor/hash-import-directive-cpp
* 在 gcc/g++ 當中, #import 是個已被棄用 (deprecated) 的延伸功能
用來做為只引入一次的 #include 使用
那麼原 PO 這裡的狀況就是:
原 PO 查到了用 MSVC 的 #import 引入這個 .dll 的方式
但卻使用在底層是 g++ 的 Code::Blocks 上
就造成了這個非標準指示詞完全不同的解釋出現問題
====
這種非標準指示詞的問題其實 C/C++ 標準裡是已經有解決方案的:
C/C++ 標準有一個指示詞叫 #pragma 專門用來表示這種指示詞
#pragma 後面可以附上一些 token 來表示我想要編譯器做什麼
標準裡並沒有定義 #pragma 要做什麼事, 全部都由編譯器決定
這樣的好處是:
一來因為都以 #pragma 開頭, 編譯器碰到看不懂的可以忽略它
二來人在看程式碼時可以明確地知道這是一個只在這個編譯器有用的指示詞
就不容易發生這種 #import 各家用途不同造成的問題了
(所以是的, 大家很熟悉的 #pragma once 和 #pramga pack
其實都是 de-facto standard, 標準沒有這麼定只是大家都這麼支援而已)
====
也是題外話, 我會說 Lipraxde 可能被 stray xxx in program 錯誤訊息搞混的原因是
這是當程式碼裡有中文沒有被引號括住也不在註解裡面時會出現的錯誤訊息
因為這些地方應該是要寫 C/C++ 語言指令的, 但卻發現了不是英文的位元組
所以吐出這個訊息說這裡有編譯器看不懂的位元組
而在原 PO 這裡, 編譯器確實看到了看不懂的位元組了
但這卻是因為 #import 解釋為 #include 造成 .dll 的二進位內容貼上至原始碼的關係
和原 PO 程式碼裡的中文完全沒有關係
====
那麼回到原 PO 接下來可能會有的問題
這其實代表你找到的 msxml4 不能直接這樣引入 gcc/g++ 編譯
那你接下來的選擇有幾個:
1. 改用 Visual Studio 編譯
既然這是 MSVC 才能用的語法, 就用 MSVC 來編就好
不過換 IDE 有很多眉角要照顧, 看你要不要花這個工夫了
2. 改找其他支援函式庫
看起來似乎是你找到的程式碼使用了 msxml4
你可以詢問寫出這些程式碼的人如果要在 Code::Blocks 上編譯要怎麼辦
是不是有什麼其他替代函式庫能使用
(對, 不是你找, 因為程式碼不是你寫的你也不知道怎麼改)
3. 改找其他能解決你的問題的解法
我其實會傾向你選擇這個選項
因為如上一條所說, 大機率是你找到的程式碼需要 msxml4 才能執行
那在沒有其他編譯器讀得懂的附加檔案 (例如 .dll 附帶的 .h) 時
基本上要花很大功夫才能把這種函式庫拿去給其他編譯器用
這樣一來, 你去找別的能夠在不同編譯器上編譯的做法還會比較簡單一點