【问题标题】:argument order in cygwin gcc 4.3 matters when linking with glib-2.0与 glib-2.0 链接时,cygwin gcc 4.3 中的参数顺序很重要
【发布时间】:2011-02-07 14:49:43
【问题描述】:

我正在尝试使用 cygwin 编译适用于 os x 和 linux 的代码。但是,我发现 gcc 的参数顺序给出了意想不到的结果。

例如,以下失败:

gcc -std=gnu99 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -lglib-2.0 -lintl -liconv -fgnu89-inline -fno-leading-underscore -o nb-learn.exe nb-learn.c

但以下工作:

gcc -std=gnu99 -fgnu89-inline -fno-leading-underscore -o nb-learn.exe nb-learn.c -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -lglib-2.0 -lintl -liconv

有人能解释一下这是如何工作的吗?另外,我可以查看一些技术或代码来让 autoconf 根据平台更改参数顺序吗?

这是错误信息的前两行:

/cygdrive/c/Users/aischein/AppData/Local/Temp/cc9MvUsf.o:nb-learn.c:(.text+0x260): undefined reference to `_g_hash_table_size'
/cygdrive/c/Users/aischein/AppData/Local/Temp/cc9MvUsf.o:nb-learn.c:(.text+0x29c): undefined reference to `_g_hash_table_get_keys'

谢谢,

SetJmp (gcc 4.3.4)

【问题讨论】:

  • pkg-config --libs glib-2.0 --cflags glib-2.0 的输出是什么?
  • Laurynas,输出为:-I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -lglib-2.0 -lintl -liconv
  • @SetJmp 第一种情况的错误信息是什么?
  • @Laurynas:我添加了一些错误信息(其余错误信息是类似符号错误)。另外,我用更明确的值替换了 pkg-config 调用。
  • 为什么需要-fno-leading-underscore

标签: gcc autoconf arguments


【解决方案1】:

GCC documentation says:

-l图书馆

-l图书馆

链接时搜索名为 library 的库。 (将库作为单独参数的第二种选择仅用于 POSIX 合规性,不推荐。)

在命令的哪个位置编写此选项会有所不同;链接器按照指定的顺序搜索和处理库和目标文件。

因此,`foo.o -lz bar.o' 在文件 foo.o 之后但在 bar.o 之前搜索库 `z'。如果bar.o 引用了`z' 中的函数,这些函数可能不会被加载。


-Wl,--start-group-Wl,--end-group 选项有时对于避免此类问题很有用。


如果您只使用共享库,这一切都不是问题。

【讨论】:

  • 为了回答问题的第二部分(autoconf 集成),将 LIBS 变量放在 autoconf 生成的 Makefile 中的源文件之后。
猜你喜欢
  • 2011-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多