※ 引述《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) 时
基本上要花很大功夫才能把这种函式库拿去给其他编译器用
这样一来, 你去找别的能够在不同编译器上编译的做法还会比较简单一点