编辑:找到了解决方案,但还不能接受我自己的答案。
我在将库静态链接到我的程序时遇到一些问题。我使用 MinGW 工具链和 Code::Blocks 作为 IDE/构建系统,从 Linux 交叉编译到 Windows。我还使用与程序相同的工具链自己编译了该库。
我对于交叉编译和 Windows 编译都是完全陌生的。
编辑:我刚刚在 Windows XP 的虚拟安装上尝试了相同的过程(使用 Code::Block 捆绑的 MinGW)并遇到了相同的问题,所以我想这不是因为交叉编译器。
我将在下面给出所有详细信息,但本质上问题是链接器抱怨缺少_imp__some_symbol符号。这些符号存在于静态库中,但不是作为_imp__some_symbol,而只是作为_some_symbol。我已经通过 grep 的输出验证了这一点nm libSomeLibrary.a
该库本身是 BearLibTerminal (您可以在https://bitbucket.org/cfyzium/bearlibterminal/downloads/找到源代码)。如前所述,我自己使用与主程序相同的工具链从源代码编译了它。
我的主程序包含的代码是 BearLibTerminal 给出的“Hello world”示例http://foo.wyrd.name/en:bearlibterminal#simple_examplec_c:
#include "BearLibTerminal.h"
int main()
{
terminal_open();
// Printing text
terminal_print(1, 1, "Hello, world!");
terminal_refresh();
// Wait until user close the window
while (terminal_read() != TK_CLOSE);
terminal_close();
}
Run Code Online (Sandbox Code Playgroud)
我完整的 Code::Blocks 构建日志可以在https://pste.eu/p/VMJp.html找到。它包含 BearLibTerminal 及其依赖项的构建日志,以及我的程序。
相关的部分(我认为)是:
i686-w64-mingw32-g++ -Wall -fexceptions …Run Code Online (Sandbox Code Playgroud) 如何编写检测指向算术类型的指针的概念?
template <typename T>
concept arithmetic = std::is_arithmetic<T>::value;
template <typename T>
concept pointer_to_arithmetic = requires (T a) {
{ *a } -> arithmetic;
};
template <typename T>
void fn() {
printf("fail\n");
}
template <pointer_to_arithmetic T>
void fn() {
printf("pass\n");
}
struct s{};
int main() {
fn<int>();
fn<int*>();
fn<s>();
fn<s*>();
}
Run Code Online (Sandbox Code Playgroud)
我试过上面的,它编译但没有做它应该做的。
预期输出为:
fail
pass
fail
fail
Run Code Online (Sandbox Code Playgroud)
相反,我得到:
fail
fail
fail
fail
Run Code Online (Sandbox Code Playgroud)
如果我替换*a为a[0].