【问题标题】:Order of parameters in g++/clang++ with makefileg++/clang++中的参数顺序与makefile
【发布时间】:2013-03-12 06:44:03
【问题描述】:

我在 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 吗?

提前致谢!

【问题讨论】:

    标签: c++ g++ makefile ld clang++


    【解决方案1】:

    您不应该组合root-config 的选项。这应该 是:

    CXXFLAGS = -Wall -O2 -g $(shell root-config --cflags)
    LIBS     = $(shell root-config -libs -glibs)
    

    然后,您可以在适当的情况下使用这些选项。 (例如,你 只是编译而不是链接时不会使用$(LIBS)。)

    至于为什么它可以在不同的系统上工作?不同的系统 有不同的链接器,它们的工作方式不同。也许 有些不需要额外的库 系统——尽管它绝对有悖于传统, 在现代系统上放置不一定是不合理的 libc.so 中的所有内容。

    最后:make 怎么可能解决这个问题。制作 从字面上对您执行的命令一无所知;他们是 只是它传递给外壳的字符串。

    【讨论】:

      【解决方案2】:

      您遇到的问题与 ld 用于解决外部引用的算法有关。您可以尝试不同的 ld,但重新排序库列表也会有所帮助。首先放置基础库(没有依赖关系的那个),然后是依赖于已经列出的库的库,依此类推。

      【讨论】:

      • 实际上这完全是倒退:没有进一步依赖关系的库应该最后出现。仅依赖于那些的库在此之前,等等。只有您的代码依赖的库,而不是其他库,首先出现。对于 single-pass 链接器,它将从您的代码中获取未解析的符号,然后尝试使用列表中的第一个库来解析它们。该库将解析一些符号,并添加新的未解析符号。然后将查询下一个库,等等。当链接器完成最后一个库时,所有符号必须被解析,否则它会失败。
      【解决方案3】:

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

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

      【讨论】:

      • 谢谢,就这样!我对此感到非常困惑……
      猜你喜欢
      • 2013-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-18
      • 1970-01-01
      • 1970-01-01
      • 2015-10-14
      相关资源
      最近更新 更多