LDADD和LIBADD的区别是什么?
What is the difference between LDADD and LIBADD?
我正在尝试设置一个使用libtool库和可执行文件混合的automake项目,并且我很难找到automake文档,特别是与告诉编译器链接到。
那么有人能解释一下LDADD
和LIBADD
的区别吗?
:
- 当一个在另一个之上使用时,
- 哪一个采用
-lname_of_library
风格值与直接文件名,等。
每当我尝试阅读相关文档时,它似乎都假设我知道一些我不知道的事情。
将LIBADD
主节点用于库,LDADD
用于可执行文件。如果您正在构建一个libtool库libfoo.la
,它依赖于另一个库libbar.la
,您将使用:
libfoo_la_LIBADD = libbar.la
如果您有其他非libtool库,您也可以添加-L
和-l
选项:
libfoo_la_LIBADD = libbar.la -L/opt/local/lib -lpng
通常,您会使用configure脚本来查找这些额外的库,并使用AC_SUBST
将它们传递给:
libfoo_la_LIBADD = libbar.la $(EXTRA_FOO_LIBS)
对于程序,只需使用LDADD
:
myprog_LDADD = libfoo.la # links libfoo, libbar, and libpng to myprog.
有时候界限有点模糊。$(EXTRA_FOO_LIBS)
可以添加到myprog_LDADD
中。将依赖项添加到libtool (.la
)库中,并使用libtool
完成所有特定于平台的链接器魔术,通常是最好的方法。它将所有链接器元数据保存在一个地方。
正如其中一本书中提到的,LDADD
是附加链接项——即在执行链接时添加的项。例如,在制作程序时。LDADD
可以指定:
- libtool文件,如
- 库,例如
-lm
,或 - 库的完整路径,例如
/lib/libmagicalwonderland.a
- 链接标志&例如
-L/opt/lib -lmagical
lib/libfudge.la
它们是按偏好顺序排列的——使用后两个只是给找麻烦,因为它们指向的东西可能存在,也可能不存在。
LIBADD
用于指定要使用的附加库。这在构建库时使用,以指定需要其他库才能构建或使用该库。您将看到它被指定为类似libfred_la_LIBADD =
的内容。它可以用来指定libtool库,或者系统库,并将这些库放置到libtool .la
库中,这样当你链接到库时,你就可以得到所有合适的库。
你应该只指定要链接的库,因此,例如,我的库libfred.la
依赖于一些数学例程,即它依赖于libm
。当我为库指定附加库时,我声明:
libfred_la_LIBADD = -lm
该依赖项在构建库时被编码,并传递给库的消费者。
经验法则是:
- LIBADD用于添加到库的东西
- LDADD用于添加到程序 的内容
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 这些情况有什么区别?我怎么知道什么是临时对象?
- 如果我提前将参数声明为变量而不是将它们内联写入函数调用,那有什么区别(在内存方面)?
- C++和Python之间平等含义的区别的根源是什么?
- 尾随空格是什么意思,它和空白有什么区别?
- 调试构建和发布构建、区别和用途是什么意思
- std::ifstream::in 和 std::ios::in 有什么区别?(显然是 C++ 中 std::ifstr
- 在 C++ STL 的比较函数中使用"<="符号而不是"<"符号有什么区别?
- 在头中声明变量而不是在源文件(cpp/h)中声明变量有什么区别
- "Thing thing;"和"Thing thing = Thing();"有什么区别,什么时候应该使用一个而不是另一个?
- 如果 a 是 cv::Mat 和 cv::Mat b=a.row(1),那么两个 cv::Mat 实例有什么区别
- 如果f是双精度数,f+=1和f+=1.0有什么区别吗?
- char和CString的区别和关系是什么?
- 那么,是什么区别了template(c.end(),_1)和template_back(_1)呢
- C++:按变量值而不是数字移位 ->有什么区别?