【问题标题】:gcc/mingw/windows: -l option only work when specified at the end of the linegcc/mingw/windows:-l 选项仅在行尾指定时有效
【发布时间】:2011-07-31 14:26:56
【问题描述】:

我的问题如下:

我有下面的小程序(参见文件 conftest.c)。

(1) 如果我像这样编译 conftest.c(最后带有 -l):

gcc -o conftest conftest.c -lintl

它编译得很好。

(2) 但是如果我像这样编译conftest.c(最后带有-l):

gcc -o conftest -lintl conftest.c

编译失败并出现错误: C:\Users\devel\AppData\Local\Temp\cce00i8m.o:conftest.c:(.text+0x16): référence indéfinie vers « imp_libintl_gettext » collect2: ld 返回 1 个退出状态。

我在 windows 下使用 mingw 和 gcc 4.5.0。 gcc 安装在 /mingw/bin 中

似乎传递给 gcc 的 -l 选项的顺序很重要。这很烦人,因为我正在尝试安装 ActiveState perl 的 Bundle::Gnome2 并且它使用 (2) 构造。有没有人知道如何解决这个问题并使 (2) 起作用?

提前致谢,


conftest.c:

#include <libintl.h>
int main(int argc, char **argv)
{
    char *x = gettext("foo");return 0;
}

【问题讨论】:

    标签: gcc mingw


    【解决方案1】:

    您应该将链接器命令行视为从左到右处理,以便首先处理较早列出的项目。

    -lXYZ 库规范将仅用于满足当前未解析的引用。

    换句话说:

    gcc -o conftest -lintl conftest.c
    

    在遇到-lintl(当然main 除外)时,实际上不会任何未解析的引用。如果你使用:

    gcc -o conftest conftest.c -lintl
    

    那么,在遇到-lintl 时,您拥有未解析的引用,所有这些引用在conftest.c 中使用但未定义。

    通常的解决方案是确保在其他对象/源文件之后列出所有库规范

    您也可以使用 -u &lt;symbol&gt; 选项来假装符号 &lt;symbol&gt; 未定义,这样库就会被购买。

    我更愿意自己修复订单,但我从来没有真正理解为什么 gcc 只是没有批量处理库规范,而是继续查看直到所有符号都满足或不再可能(或至少提供一个选项)。

    在你的情况下,你可以使用类似的东西:

    gcc -o conftest -u gettext -lintl conftest.c
    

    您可以为每个要假装未定义的符号指定更多 -u 选项(即,根据需要引入尽可能多的库)。

    【讨论】:

      【解决方案2】:

      gcc 有一个关闭模式,在这种模式下,它会扫描提供的库,令人作呕,正如 paxdiablo 所描述的那样。它与 --start-group 和 --end-group 一起使用,例如

      gcc -o conftest --start-group -lintl conftest.c --end-group
      

      引用手册:“使用此选项具有显着的性能成本。最好仅在两个或多个存档之间存在不可避免的循环引用时使用它。”

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-07
        • 1970-01-01
        • 2010-11-17
        • 1970-01-01
        • 2017-04-18
        相关资源
        最近更新 更多