link 标志对静态库意味着什么?
What do link flags mean for static library?
"ar" -- 只是创建存档的工具。
所有 "lib*.a" 形式的静态库实际上只是归档编译对象 + 带有符号 table 的附加文件,由 "ranlib" 添加。
在创建此类库期间没有 linking 正在执行。
那么,为什么大多数项目在创建此类("lib*.a" 静态库)存档期间在其 Makefile.am
中使用 ***_LDFLAGS
***_LIBADD
?
automake 会忽略这些标志(以防它们与任何 "lib*.a" 静态库相关),还是实际上 link 那里有什么东西?
您的问题 Does automake ignore them
的答案是:否
完全正确:“"ar" -- 只是创建档案的工具。”
但是,Automake 根本不会忽略 Makefile.am
中的 ***_LDFLAGS
***_LIBADD
,否则如果它们对构建系统没有任何意义,那么拥有这样的标志有什么意义!
来自文档(link 下面给出):
- “
library_LIBADD
”变量应该用于列出额外的 libtool 对象(.lo 文件)或 libtool 库 (.la) 添加到库中。
- “
library_LDFLAGS
”变量是列出其他 libtool linking 标志的地方,例如 -version-info
、-static
,还有更多。
有关更多详细信息,您应该阅读此 Libtool 文档以更清楚地了解这些标志。
编辑:
由于您的问题仍然很笼统,让我将其分为两种不同的情况...
静态库是stand-alone:
- 在这种情况下,
***_LIBADD
可能用处不大,如文档中所述:“library_LIBADD
变量应该用于列出额外的 libtool 对象(.lo
文件) 或 libtool 库 (.la
) 添加到 库 "
- 这意味着,如果您的静态库没有依赖项,则此标志在
Makefile.am
. 中没有用处
静态库是依赖的(不是 stand-alone)
- 从上面引用的文档中可以清楚地看出,
***_LIBADD
标志用于提及构建当前 库.[= 所需的库名称。 94=]
- 所以这个标志在这样的要求中是必要的。
关于 ***_LDFLAGS
,如文档中所述,library_LDFLAGS
变量是列出其他 libtool linking 标志 的地方那个图书馆。
- 如果你的库不需要这样的标志,那么这个也可以忽略。这完全取决于您想要的最终结果。
另外 link 供您参考:
- LDFLAGS usage in autotools with libtool
- What is the difference between LDADD and LIBADD?
我希望这个编辑能满足您的需求。
PS:如果您仔细阅读我的回答并阅读文档,您可能会得到相同的数据。喜欢。 :)
So why do most of projects use ***_LDFLAGS
***_LIBADD
in their Makefile.am during creation of such ("lib*.a" static library) archives?
GNU 构建系统能够使用 --enable-shared
和 --enable-static
标志创建在 configure
时间确定的动态和静态库(或两者)。正如您所猜测的那样,_LDFLAGS
和 _LIBADD
更倾向于动态共享对象或程序 linkage 而不是静态 linker。 libtool
的静态 linker 本质上是另一个 link 调用 ar
来创建存档(省略所有标志)的过程。例如:
lib_LTLIBRARIES=libfoo.la
libfoo_la_SOURCES=$(SRCS)
libfoo_la_LDFLAGS=-Wl,-t
当同时生成共享库和静态库时,输出如下:
libtool: link: gcc -shared -fPIC -DPIC .libs/foo.o -g -O2 -Wl,-t -Wl,-soname -Wl,libfoo.so.0 -o .libs/libfoo.so.0.0.0
...
libtool: link: (cd ".libs" && rm -f "libfoo.so.0" && ln -s "libfoo.so.0.0.0" "libfoo.so.0")
libtool: link: (cd ".libs" && rm -f "libfoo.so" && ln -s "libfoo.so.0.0.0" "libfoo.so")
libtool: link: ar cru .libs/libfoo.a foo.o
libtool: link: ranlib .libs/libfoo.a
libtool: link: ( cd ".libs" && rm -f "libfoo.la" && ln -s "../libfoo.la" "libfoo.la" )
automake
会忽略 _LDFLAGS
;但是执行 linking (libtool
) 的脚本不会。它还会查找影响 linking 的标志。例如:
lib_LTLIBRARIES=libfoo.la
libfoo_la_SOURCES=$(SRCS)
libfoo_la_LDFLAGS=-Wl,-t -static
将仅生成静态库,即使configure --disable-static
是运行生成Makefile。
libtool
只是本机 compiler/linker 工具的包装脚本以实现可移植性。
"ar" -- 只是创建存档的工具。
所有 "lib*.a" 形式的静态库实际上只是归档编译对象 + 带有符号 table 的附加文件,由 "ranlib" 添加。 在创建此类库期间没有 linking 正在执行。
那么,为什么大多数项目在创建此类("lib*.a" 静态库)存档期间在其 Makefile.am
中使用 ***_LDFLAGS
***_LIBADD
?
automake 会忽略这些标志(以防它们与任何 "lib*.a" 静态库相关),还是实际上 link 那里有什么东西?
您的问题 Does automake ignore them
的答案是:否
完全正确:“"ar" -- 只是创建档案的工具。”
但是,Automake 根本不会忽略 Makefile.am
中的 ***_LDFLAGS
***_LIBADD
,否则如果它们对构建系统没有任何意义,那么拥有这样的标志有什么意义!
来自文档(link 下面给出):
- “
library_LIBADD
”变量应该用于列出额外的 libtool 对象(.lo 文件)或 libtool 库 (.la) 添加到库中。 - “
library_LDFLAGS
”变量是列出其他 libtool linking 标志的地方,例如-version-info
、-static
,还有更多。
有关更多详细信息,您应该阅读此 Libtool 文档以更清楚地了解这些标志。
编辑:
由于您的问题仍然很笼统,让我将其分为两种不同的情况...
静态库是stand-alone:
- 在这种情况下,
***_LIBADD
可能用处不大,如文档中所述:“library_LIBADD
变量应该用于列出额外的 libtool 对象(.lo
文件) 或 libtool 库 (.la
) 添加到 库 " - 这意味着,如果您的静态库没有依赖项,则此标志在
Makefile.am
. 中没有用处
- 在这种情况下,
静态库是依赖的(不是 stand-alone)
- 从上面引用的文档中可以清楚地看出,
***_LIBADD
标志用于提及构建当前 库.[= 所需的库名称。 94=] - 所以这个标志在这样的要求中是必要的。
- 从上面引用的文档中可以清楚地看出,
关于 ***_LDFLAGS
,如文档中所述,library_LDFLAGS
变量是列出其他 libtool linking 标志 的地方那个图书馆。
- 如果你的库不需要这样的标志,那么这个也可以忽略。这完全取决于您想要的最终结果。
另外 link 供您参考:
- LDFLAGS usage in autotools with libtool
- What is the difference between LDADD and LIBADD?
我希望这个编辑能满足您的需求。
PS:如果您仔细阅读我的回答并阅读文档,您可能会得到相同的数据。喜欢。 :)
So why do most of projects use
***_LDFLAGS
***_LIBADD
in their Makefile.am during creation of such ("lib*.a" static library) archives?
GNU 构建系统能够使用 --enable-shared
和 --enable-static
标志创建在 configure
时间确定的动态和静态库(或两者)。正如您所猜测的那样,_LDFLAGS
和 _LIBADD
更倾向于动态共享对象或程序 linkage 而不是静态 linker。 libtool
的静态 linker 本质上是另一个 link 调用 ar
来创建存档(省略所有标志)的过程。例如:
lib_LTLIBRARIES=libfoo.la
libfoo_la_SOURCES=$(SRCS)
libfoo_la_LDFLAGS=-Wl,-t
当同时生成共享库和静态库时,输出如下:
libtool: link: gcc -shared -fPIC -DPIC .libs/foo.o -g -O2 -Wl,-t -Wl,-soname -Wl,libfoo.so.0 -o .libs/libfoo.so.0.0.0
...
libtool: link: (cd ".libs" && rm -f "libfoo.so.0" && ln -s "libfoo.so.0.0.0" "libfoo.so.0")
libtool: link: (cd ".libs" && rm -f "libfoo.so" && ln -s "libfoo.so.0.0.0" "libfoo.so")
libtool: link: ar cru .libs/libfoo.a foo.o
libtool: link: ranlib .libs/libfoo.a
libtool: link: ( cd ".libs" && rm -f "libfoo.la" && ln -s "../libfoo.la" "libfoo.la" )
automake
会忽略 _LDFLAGS
;但是执行 linking (libtool
) 的脚本不会。它还会查找影响 linking 的标志。例如:
lib_LTLIBRARIES=libfoo.la
libfoo_la_SOURCES=$(SRCS)
libfoo_la_LDFLAGS=-Wl,-t -static
将仅生成静态库,即使configure --disable-static
是运行生成Makefile。
libtool
只是本机 compiler/linker 工具的包装脚本以实现可移植性。