指定要生成的备用编译器和链接器

Posted

技术标签:

【中文标题】指定要生成的备用编译器和链接器【英文标题】:Specify alternate compiler and linker to make 【发布时间】:2015-08-20 15:24:02 【问题描述】:

我有一个默认的 C/C++ 工具集 (gcc 4.8),并且最近在它自己的目录中构建并安装了 5.2。我想使用一个使用 CC 和 CXX 显式编译但使用隐式内置规则链接 .o 文件以构建可执行文件的 makefile 构建一些 C++ 程序。

当我在 makefile 上运行 make 时,我使用命令

make all CC=/usr/gcc-5.2.0/bin/gcc-5.2.0 CXX=/usr/gcc-5.2.0/bin/g++-5.2.0

编译步骤都使用 5.2 编译器,但是在构建可执行文件时,默认的 g++ 用于链接所有内容。现在,这恰好起作用并且结果运行,但这不是我想要的。我尝试添加

LD=/usr/gcc-5.2.0/bin/g++-5.2.0

到 make 命令行,但 LD 被忽略。在不改变makefile的情况下,如何获得使用5.2编译器的链接步骤?

这是制作文件:

CPPFLAGS = -Wall
LDFLAGS = -lstdc++
CXX = g++
CC = g++

all: TestSHA3 HashSHA3 HashZeroBytes LongTest sha3sum

debug: override CPPFLAGS += -ggdb
debug: all

SHA3-o3:
        $(CXX) $(CPPFLAGS) -O3 -c -o SHA3.o SHA3.cpp
o3:  SHA3-o3 all

TestSHA3: TestSHA3.o SHA3.o
HashSHA3: HashSHA3.o SHA3.o
HashZeroBytes: HashZeroBytes.o SHA3.o
LongTest: LongTest.o SHA3.o
sha3sum: sha3sum.o SHA3.o

.PHONY: clean realclean rc debug all o3 SHA3-o3
clean:
        rm SHA3.o TestSHA3.o HashSHA3.o HashZeroBytes.o LongTest.o sha3sum.o
rc: realclean
realclean: clean
        rm TestSHA3 HashSHA3 HashZeroBytes LongTest sha3sum

命令如下:

 make all CXX=g++-5.2.0 LD=g++-5.2.0

这是制作的结果:

g++-5.2.0  -Wall  -c -o TestSHA3.o TestSHA3.cpp
g++-5.2.0  -Wall  -c -o SHA3.o SHA3.cpp
g++ -lstdc++  TestSHA3.o SHA3.o   -o TestSHA3
g++-5.2.0  -Wall  -c -o HashSHA3.o HashSHA3.cpp
g++ -lstdc++  HashSHA3.o SHA3.o   -o HashSHA3
g++-5.2.0  -Wall  -c -o HashZeroBytes.o HashZeroBytes.cpp
g++ -lstdc++  HashZeroBytes.o SHA3.o   -o HashZeroBytes
g++-5.2.0  -Wall  -c -o LongTest.o LongTest.cpp
g++ -lstdc++  LongTest.o SHA3.o   -o LongTest
g++-5.2.0  -Wall  -c -o sha3sum.o sha3sum.cpp
g++ -lstdc++  sha3sum.o SHA3.o   -o sha3sum

【问题讨论】:

发布 Makefile 的内容。 Make 不了解 C/C++;它只使用变量CCLD 如果步骤规则这样做。 你的makefile不完整,link命令在哪里? 你读过正文吗?链接是通过隐式规则完成的。该规则由“TestSHA3: TestSHA3.o SHA3.o”之类的行触发。 【参考方案1】:

用途:

make all CXX=g++-5.2.0 CC=g++-5.2.0

链接的隐式规则使用CC (make manual):

n 是通过运行链接器从 n.o 自动生成的(通常称为 ld) 通过 C 编译器。使用的精确配方是‘$(CC) $(LDFLAGS) 没有 $(LOADLIBES) $(LDLIBS)’。

使用您的 Makefile 和虚拟源文件:

$ make all CXX=`which g++`
/usr/bin/g++  -Wall  -c -o TestSHA3.o TestSHA3.cpp
/usr/bin/g++  -Wall  -c -o SHA3.o SHA3.cpp
g++ -lstdc++  TestSHA3.o SHA3.o   -o TestSHA3
/usr/bin/g++  -Wall  -c -o HashSHA3.o HashSHA3.cpp
g++ -lstdc++  HashSHA3.o SHA3.o   -o HashSHA3
/usr/bin/g++  -Wall  -c -o HashZeroBytes.o HashZeroBytes.cpp
g++ -lstdc++  HashZeroBytes.o SHA3.o   -o HashZeroBytes
/usr/bin/g++  -Wall  -c -o LongTest.o LongTest.cpp
g++ -lstdc++  LongTest.o SHA3.o   -o LongTest
/usr/bin/g++  -Wall  -c -o sha3sum.o sha3sum.cpp
g++ -lstdc++  sha3sum.o SHA3.o   -o sha3sum

$ make all CC=`which g++`
g++  -Wall  -c -o TestSHA3.o TestSHA3.cpp
g++  -Wall  -c -o SHA3.o SHA3.cpp
/usr/bin/g++ -lstdc++  TestSHA3.o SHA3.o   -o TestSHA3
g++  -Wall  -c -o HashSHA3.o HashSHA3.cpp
/usr/bin/g++ -lstdc++  HashSHA3.o SHA3.o   -o HashSHA3
g++  -Wall  -c -o HashZeroBytes.o HashZeroBytes.cpp
/usr/bin/g++ -lstdc++  HashZeroBytes.o SHA3.o   -o HashZeroBytes
g++  -Wall  -c -o LongTest.o LongTest.cpp
/usr/bin/g++ -lstdc++  LongTest.o SHA3.o   -o LongTest
g++  -Wall  -c -o sha3sum.o sha3sum.cpp
/usr/bin/g++ -lstdc++  sha3sum.o SHA3.o   -o sha3sum

$ make all CC=`which g++` CXX=`which g++`
/usr/bin/g++  -Wall  -c -o TestSHA3.o TestSHA3.cpp
/usr/bin/g++  -Wall  -c -o SHA3.o SHA3.cpp
/usr/bin/g++ -lstdc++  TestSHA3.o SHA3.o   -o TestSHA3
/usr/bin/g++  -Wall  -c -o HashSHA3.o HashSHA3.cpp
/usr/bin/g++ -lstdc++  HashSHA3.o SHA3.o   -o HashSHA3
/usr/bin/g++  -Wall  -c -o HashZeroBytes.o HashZeroBytes.cpp
/usr/bin/g++ -lstdc++  HashZeroBytes.o SHA3.o   -o HashZeroBytes
/usr/bin/g++  -Wall  -c -o LongTest.o LongTest.cpp
/usr/bin/g++ -lstdc++  LongTest.o SHA3.o   -o LongTest
/usr/bin/g++  -Wall  -c -o sha3sum.o sha3sum.cpp
/usr/bin/g++ -lstdc++  sha3sum.o SHA3.o   -o sha3sum

【讨论】:

如果我定义 CC=g++-5.2.0 就可以了。当然,.c 文件是使用 g++ 编译器编译的,但我想没关系。 除了编译器版本之外,只要您启用了-lstdc++ 选项,与CC=gcc 的链接也应该可以工作 @sizzzzlerz - 我只是在写一个评论 - 我使用它,因为你已经在你的项目中将 CC 设置为 g++ 出于某种原因

以上是关于指定要生成的备用编译器和链接器的主要内容,如果未能解决你的问题,请参考以下文章

链接脚本解析

是否有 GCC 编译器/链接器选项来更改 main 的名称? [复制]

GCC链接器:在指定部分移动符号

C语言编译链接生成可执行文件四大步骤:预处理->编译->汇编->链接

CSAPP

27软件包管理