在 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
这给了我未定义的引用和 Ubuntu 服务器上的链接器错误。我已经尝试过设置库,LDFLAGS
但它会产生相同的结果。当我手动编译它并将源文件和 -o 选项放在库之前时,它编译没有问题。
从其他线程中,我认为命令的顺序可能很重要,但我想知道为什么它在某些机器上起作用而在其他机器上却没有。即使顺序很重要,我认为make
自己足够聪明,可以自己解决。
现在的问题是:我该如何解决这个问题?我必须使用不同版本的 make 或 ld 吗?我必须修改我的makefile吗?
提前致谢!