gcc / mingw / windows:-l选项仅在行尾指定时才起作用

时间:2011-07-31 14:26:57

标签: gcc mingw

我的问题如下:

我有下面的小程序(参见文件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érenceindéfinievers« imp _libintl_gettext» collect2:ld返回1退出状态。

我在windows下使用mcc与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;
}

2 个答案:

答案 0 :(得分:0)

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

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

换句话说:

gcc -o conftest -lintl conftest.c

在遇到-lintl时当然不会拥有任何未解析的引用(当然不是main)。如果您使用:

gcc -o conftest conftest.c -lintl

然后,在遇到-lintl时,包含未解析的引用,所有使用但未在conftest.c中定义的引用。

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

您还可以使用-u <symbol>选项假装未定义符号<symbol>,以便无论如何都可以购买该库。

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

在您的情况下,您可以使用以下内容:

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

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

答案 1 :(得分:0)

gcc有一个闭包模式,在这种模式下,它会扫描提供的库,但就像paxdiablo所描述的那样。它适用于--start-group和--end-group,如

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

引用手册:“使用此选项会产生很大的性能成本。最好只在两个或多个档案之间存在不可避免的循环引用时使用它。”