我的问题如下:
我有下面的小程序(参见文件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;
}
答案 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
引用手册:“使用此选项会产生很大的性能成本。最好只在两个或多个档案之间存在不可避免的循环引用时使用它。”