代码之家  ›  专栏  ›  技术社区  ›  jww avp

指导AutoCADE使用C++编译器实现*.s文件?

  •  2
  • jww avp  · 技术社区  · 7 年前

    我们有一个C++项目。我们需要组装一个 *.S 通过编译器文件。在我们 GNUmakefile 我们使用:

    # ARM asm implementation.
    aes-armv4.o : aes-armv4.S
        $(CXX) $(CXXFLAGS) $(AES_FLAGS) -mfloat-abi=$(FP_ABI) -c $<
    

    我们的 Makefile.am ,这取决于 AC_SUBST([AES_FLAGS], [-march=armv7-a -Wa,--noexecstack]) 在里面 configure.ac :

    libaes_armv4_la_SOURCES = aes-armv4.S
    libaes_armv4_la_CXXFLAGS = $(AM_CXXFLAGS) $(AES_FLAGS)
    

    然而,结果 Makefile 使用 C 编译器无法使用我们为源文件设置的标志:

    make[1]: Entering directory '/home/build/cryptopp'
    /bin/bash ./libtool --mode=compile gcc -DHAVE_CONFIG_H -I. -g -O2 -MT aes-armv4.lo -MD -MP -MF .deps/aes-armv4.Tpo -c -o aes-armv4.lo aes-armv4.S
    libtool: compile: gcc -DHAVE_CONFIG_H -I. -g -O2 -MT aes-armv4.lo -MD -MP -MF .deps/aes-armv4.Tpo -c aes-armv4.S -fPIC -DPIC -o .libs/aes-armv4.o
    libtool: compile: gcc -DHAVE_CONFIG_H -I. -g -O2 -MT aes-armv4.lo -MD -MP -MF .deps/aes-armv4.Tpo -c aes-armv4.S -o aes-armv4.o >/dev/null 2>&1
    mv -f .deps/aes-armv4.Tpo .deps/aes-armv4.Plo
    

    AES_FLAGS 提供 -march=armv7-a -Wa,--noexecstack . -march=armv7-a 由于未对齐的负载和 -Wa,--noexecstack 是安全要求。

    手册没有说明如何告诉AutoToo工具在这个例子中使用C++编译器。也看到 8.9 C++ Support .

    我如何告诉AutoAkter使用源代码文件的C++编译器和标志?


    我们的 组态AC 有以下内容。它缺少对C编译器的引用,并且从不涉及 AC_PROG_CC , CFLAGS AM_CFLAGS 因为我们是C++项目:

    AC_PROG_CXX
    AC_LANG([C++])
    
    ...
    AC_SUBST([AES_FLAGS], [-march=armv7-a -Wa,--noexecstack])
    
    2 回复  |  直到 7 年前
        1
  •  3
  •   Sam Varshavchik    7 年前

    自动生成使用 CCAS 宏指定要运行的编译器,使用 CCASFLAGS AM_CCASFLAGS 指定任何自定义编译选项。

    More information

        2
  •  1
  •   user539810    7 年前
    # Old-style (but portable) inference rules for assembler and C++
    .SUFFIXES:
    .SUFFIXES: .s .S .sx .o .cpp .cc .C .cxx .c++ .cp
    
    .S.o:
        $(CXX) $(CXXFLAGS) $(AES_FLAGS) -mfloat-abi=$(FP_ABI) -c $<
    
    ######## OR ########
    
    # GNU make pattern rule syntax
    %.o: %.S
        $(CXX) $(CXXFLAGS) $(AES_FLAGS) -mfloat-abi=$(FP_ABI) -c $<
    

    如果您使用的是gnu make,那么选择哪一个并不重要,但是您应该了解posix推理规则的用法和局限性。 (GNU make calls them "suffix rules") 包括它们不能有任何依赖项(否则它们被认为是正常目标)以及后缀必须是预定义的。

    这个 make 我使用的实现有一组默认的C++规则集,有时甚至会有某些特定于实现的特性的附加扩展,例如编译到汇编程序代码中。 the default rules prescribed by POSIX .

    不管怎样,不要把它们组合起来,否则你会混淆你的 制作 实用性,更不用说你自己了。