【问题标题】:Should (and how to do it) include paths be collapsed in configure script?是否应该(以及如何做)在配置脚本中包含折叠路径?
【发布时间】:2013-03-06 04:28:18
【问题描述】:

在我的configure/configure.ac 中,我进行了多次PKG_CHECK_MODULES 呼叫。他们中的大多数返回相同的-I path:-I/usr/local/include,也返回相同的-L path: -L/usr/local/lib.

我会说-I path 没有任何区别,因为 gcc 一次编译一个源。编译多个源时可能会有所不同?

但是,它可能确实对库产生了影响,因为以下构造是可能的:

-L/usr/local/lib -lX11 -L/usr/lib -lcurses -L/opt/lib -lcups

我猜每个-L option 都会改变当前顶级库的搜索路径。

这一切都正确吗?我应该忽略-I 冗余,还是尝试折叠路径?如何折叠它们?

(PS。请不要对-I-l中的字母感到困惑:第一个是大写"i",我要问的是包含路径选项)

【问题讨论】:

    标签: autotools autoconf include-path


    【解决方案1】:

    每个-L 选项实际上只是在当前搜索路径的末尾添加了一些内容,这意味着链接到不同位置的不同库是一个很难产生通用解决方案的问题。如果您在两个位置 A 和 B 中拥有相同的两个库,并且您想要 A 中的第一个库和 B 中的第二个库,那么使用 -L 选项执行此操作会非常烦人。您最终不得不在链接行中包含 .so 文件的完整路径。

    换句话说,在:

    -L/usr/local/lib -lX11 -L/usr/lib -lcurses -L/opt/lib -lcups
    

    libcups 将首先在 /usr/local/lib 中搜索,然后是 /usr/lib,然后是 /opt/lib。如果/usr/local/lib 中有一个libcups,你仍然会得到错误的。唯一可以确定的方法是将-L/opt/lib -lcups 替换为/opt/lib/libcups.so(不那么便携;例如,它不适用于HP-UX 或AIX)。

    为了回答您的问题,大多数情况下人们不会费心尝试清理冗余。这种编译命令行在使用多个库的项目中相当典型。

    【讨论】:

      【解决方案2】:

      您可以修改PKG_CHECK_MODULES 以将必要的标志放入LDFLAGSCPPFLAGS 而不是FOO_LIBSFOO_CFLAGS 并让它检查pkg-config 的结果是否是多余的,如果已经存在则不要添加它们展示。这样做时,最好添加一些AC_CHECK_LIB 的调用来验证pkg-config 返回的信息。这还有一个额外的好处,那就是基本上清理了所有 Makefile.am,因为它们不再需要显式引用 @FOO_LIBS@@FOO_CFLAGS@。但是,停止使用PKG_CHECK_MODULES 可能更容易。 (见PKG_CHECK_MODULES considered harmful?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-21
        • 2018-11-22
        • 1970-01-01
        • 2013-07-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多