gpt4 book ai didi

c++ - g++/clang++ 中带有 makefile 的参数顺序

转载 作者:搜寻专家 更新时间:2023-10-30 23:59:38 26 4
gpt4 key购买 nike

我在 Ubuntu 12.04 上使用 CERN 的 ROOT 时偶然发现了这个非常烦人的问题,但我认为这是一个更普遍的问题。

我有一些带有外部引用的 C++ 代码,我使用以下 makefile 编译和链接这些代码。在我的装有 OS X 10.8 的 Mac 和装有 SL5 的服务器上,这工作正常。

CXX=clang++
CXXFLAGS=-Wall -O2 -g $(shell root-config --cflags --libs)

testroot: testroot.cc

它的计算结果为

clang++ -Wall -O2 -g -pthread -m64 -I/opt/ROOT/5.34.05/include/root -L/opt/ROOT/5.34.05/lib/root -lCore -lCint -lRIO -lNet -lHist -lGraf -lGraf3d -lGpad -lTree -lRint -lPostscript -lMatrix -lPhysics -lMathCore -lThread -pthread -lm -ldl -rdynamic    testroot.cc   -o testroot

这给了我 undefined reference 和 Ubuntu 服务器上的链接器错误。我已经尝试在 LDFLAGS 中设置库,但结果相同。当我手动编译它并将源文件和 -o 选项放在库之前时,它编译没有问题。

在其他线程中,我认为命令的顺序可能很重要,但我想知道为什么它在某些机器上起作用而在其他机器上却没有。即使顺序很重要,我认为 make 足够聪明,可以自己解决。

现在的问题是:我怎样才能解决这个问题?我必须使用不同版本的 make 或 ld 吗?我必须修改我的 makefile 吗?

提前致谢!

最佳答案

您不应该向 LDFLAGS 添加 -l 参数(甚至不要提及 CXXFLAGS)。在 implicit make rules 的情况下,链接库的正确变量是 LDLIBS就像在你的 makefile 中一样。

在某些机器上,顺序无关紧要,因为对于 GNU ld,它只对静态库或启用 --as-needed 选项(在某些系统上默认启用)有影响。

关于c++ - g++/clang++ 中带有 makefile 的参数顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15569850/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com