【问题标题】:Is it possible to set the compiling and linking flags in Makefile.am instead of configure.ac?是否可以在 Makefile.am 而不是 configure.ac 中设置编译和链接标志?
【发布时间】:2024-01-18 11:45:01
【问题描述】:

是否可以在 Makefile.am 中设置此类标志?这将解决我在https://*.com/questions/22617744/how-to-disable-the-runtime-checking-of-dynamic-libraries-if-they-are-not-used 提出的问题。

【问题讨论】:

    标签: compilation linker autotools dynamic-linking ldflags


    【解决方案1】:

    如果您使用 Autoconf 和 A​​utomake,那么您应该能够在编译时传入链接器标志以使用以下内容进行 make:

    make LDFLAGS='-L/my/nonstandard/prefix/lib' target
    

    此外,您可以对 CC、CFLAGS、CPP、CPPFLAGS 和 LIBS 执行此操作。例如:

    make CC=gcc-4.2 \
        LIBS='-lmylibrary -lhislib ../lib/libcustom.a' \
        LDFLAGS='-L/opt/vend/lib' \
        CPPFLAGS='-I../include' \
        CFLAGS='-Wall' \
        target
    

    如果你想让它们在 make 文件中永久存在,请将它们添加到 automake 变量中:

    AM_LIBS     = -lmylibrary -lhislib ../lib/libcustom.a
    AM_LDFLAGS  = -L/opt/vend/lib
    AM_CPPFLAGS = -I../include
    AM_CFLAGS   = -Wall
    

    使用上面的变量,你仍然可以通过使用前面的方法来添加标志。

    【讨论】:

    • AM_LIBS 不存在。
    • prog_LDADD 代替似乎无处不在的 AM_LIBS 的工作。
    • @DanielKO 有了基本的 Makefile.am,你是对的,但是只需在目标宏之前将行添加到 Makefile.am。
    【解决方案2】:

    一些链接器可以选择在链接时忽略未解析的符号 - 只要您确定库将在 加载 时可用。例如,对于GNU ld,有:--unresolved-symbols,其中类似的选项:--unresolved-symbols=ignore-in-shared-libs 可能是合适的。 OS X (Mach-O) 链接器有:-undefined <error|warning|suppress|dynamic_lookup>

    运行程序时,所有符号必须由动态链接器/加载器解析。

    这不应与 dynamic loading 设施混淆,后者要求您在运行时加载库,并获取给定函数名称的函数指针或句柄。

    对于程序'prog',您可以在Makefile.am 中为prog_LDFLAGS 添加额外的标志。

    【讨论】:

      最近更新 更多