指定要生成的备用编译器和链接器
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++;它只使用变量CC
和LD
如果步骤规则这样做。
你的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 的名称? [复制]