【问题标题】:Link a static library in gcc without having to specify the 'lib' prefix在 gcc 中链接静态库,而无需指定“lib”前缀
【发布时间】:2015-09-01 21:39:00
【问题描述】:

根据this的问题,gcc的-l命令要求你的库被命名为libXXX.a。

有没有办法通过 gcc 使用不同的命令来链接静态库?目标是避免这个 lib- 前缀。

【问题讨论】:

    标签: c gcc static-libraries


    【解决方案1】:

    只需像这样在输入文件中传递库:

    gcc main.c yourlibrary.a -o prog
    

    【讨论】:

    • 细说,-l只需要搜索库路径,自动选择标准命名模式的库。
    • 接受,因为它是解决方案的最简单实现,尽管 Brian McFarland 的回答也很棒(他教了我一些关于制作文件的知识)。
    【解决方案2】:

    就像农齐奥说的。只需将其作为输入文件直接传递即可。他打败了我,但无论如何这里有一个完整的例子。

    mylib.c:

    #include <stdio.h>
    void say_hi(void) 
    { 
      printf("hi\n"); 
    }
    

    main.c:

    extern void say_hi(void);
    int main(int argc, char**argv)
    {
      say_hi();
      return 0;
    }
    

    生成文件:

    main: main.c mylib.a
        gcc -o main main.c mylib.a
    
    mylib.a: mylib.o
        ar rcs mylib.a mylib.o
    
    mylib.o: mylib.c
        gcc -c -o $@ $^
    

    我意识到这需要一些 Make 的背景知识。要在不使用 make 的情况下执行相同的操作,请按顺序运行以下命令:

    gcc -c -o mylib.o mylib.c
    ar rcs mylib.a mylib.o
    gcc -o main main.c mylib.a
    

    【讨论】:

    • 原谅我的新手,但你能解释一下你的 gcc -c -o $@ $^ 命令吗?
    • 当然。这是一个 makefile 的东西,而不是 gcc 的东西。这些被称为自动变量。 $@ 表示生成目标的名称。 $^ 表示 : 右侧的先决条件(即依赖项)。所以在这种情况下,它是gcc -c -o mylib.o mylib.c 的简写。在这里用处不大。我写这个更多是出于习惯。但它对于通用规则是必要的,并且在其他情况下也很有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多