小编Luk*_*sić的帖子

静态库缺少`__imp_`符号

编辑:找到了解决方案,但还不能接受我自己的答案。

我在将库静态链接到我的程序时遇到一些问题。我使用 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)

c++ windows mingw codeblocks static-linking

7
推荐指数
1
解决办法
1751
查看次数

如何使用类型特征和概念检测指向算术类型的指针?

如何编写检测指向算术类型的指针的概念?

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)

如果我替换*aa[0].

c++ type-traits c++-concepts c++20

4
推荐指数
1
解决办法
78
查看次数