【问题标题】:Pass directory to C++ application from compiler从编译器将目录传递给 C++ 应用程序
【发布时间】:2011-11-25 04:32:01
【问题描述】:

某些应用程序包含由位于 /usr/libexec 中的主应用程序运行的脚本。但是,autoconf 脚本可以通过将 --libexecdir 传递给配置脚本来更改该目录。

例如,在git源代码中运行./configure时,我可以将--libexecdir设置为我想要的任何目录,程序仍然可以运行。

我需要在 C++ 中添加什么才能使此功能正常工作?换句话说,我怎样才能通过编译到程序中的配置脚本来设置目录名称?

【问题讨论】:

    标签: c++ directory autotools


    【解决方案1】:

    您需要将 @libexecdir@ 替换变量的值(如 Makefile.in 中使用的)暴露给您的 C++ 代码。最简单、最可靠的方法是在需要知道的目标文件的编译器命令行上使用-D 开关:

    foo.o: CPPFLAGS += -DLIBEXECDIR='"$(libexecdir)"'
    

    foo.cc 中,LIBEXECDIR 将是一个预处理器宏,扩展为具有您需要的路径的字符串常量。但是有两个警告:上面的 Makefile sn-p 使用了 GNU make 功能,target-specific variables。它不适用于其他 Make 实现。另外,我没有费心在$(libexecdir) 的扩展中引用任何字符。完全防御性的引用看起来像这样:

    foo.o: CPPFLAGS += \
      -DLIBEXECDIR='"$(subst ",\",$(subst ','\'',$(subst \,\\,$(libexecdir))))"'
    

    如果您希望能够使用 Windows 路径名,那么您肯定至少需要最里面的 $(subst ...) 结构,而斜线的方向是错误的。人们通常不会将 '" 放在路径名中,所以在有人抱怨之前我可能不会打扰外面的两个。

    同样的技术适用于任何不是AC_DEFINE@whatever@ 替换变量。


    您可能认为您可以使用AC_DEFINE_UNQUOTED 以某种方式将$(libexecdir) 的值转换为config.h,从而避免所有这些在命令行中乱七八糟的事情。不幸的是,Autoconf 并没有在配置时完全计算其 @*dir@ 替换的值:

    # near the top of the generated 'configure':
    exec_prefix=NONE
    libexecdir='${exec_prefix}/libexec'
    
    # much, much later -- as part of AC_OUTPUT:
    test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
    

    因此,如果你用AC_DEFINE_UNQUOTED 做明显的事情,你会得到类似的东西

    #define LIBEXECDIR "${exec_prefix}/libexec"
    

    在您的 config.h 中。所以那是行不通的,而且我看不出有什么好办法让它发挥作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多