clang ++没有看到g ++看到的定义

时间:2015-10-26 08:29:03

标签: c++ c++11 ubuntu

在将ubuntu从15.04更新到15.10时,我看到clang如何解析对某些库的引用的变化。 (我认为这不是一个ubuntu问题,而是一个铿锵的问题,而且我已经错过了一些关于clang最近如何改变的微妙之处。)

这是一个很小的测试示例,仅用于解释这种现象:

#include <jsoncpp/json/json.h>
#include <iostream>

int main(int argc, char *argv[]) {
    std::cout << argc << " - " << argv[0] << std::endl;
    Json::Reader reader;
    Json::Value root;
    reader.parse("", root, false);
    std::cout << reader.getFormattedErrorMessages() << std::endl;
    return 0;
}

如果我像这样编译

clang++ -ggdb3 -Wall -Wextra -std=c++14 -o json_test json_test.cc -ljsoncpp

/tmp/json_test-680d3a.o: In function `main':
/tmp/json_test.cc:10: undefined reference to `Json::Reader::getFormattedErrorMessages() const'
clang: error: linker command failed with exit code 1 (use -v to see invocation)

然而这个定义似乎存在:

jeff@birdsong:src $ objdump -TC /usr/lib/x86_64-linux-gnu/libjsoncpp.so | grep getFormatted
000000000000e190 g    DF .text  00000000000004d2  Base        Json::OurReader::getFormattedErrorMessages[abi:cxx11]() const
000000000000dc70 g    DF .text  00000000000004d2  Base        Json::Reader::getFormattedErrorMessages[abi:cxx11]() const
jeff@birdsong:src $ 

abi:cxx11建议我至少可以试试这个

clang++ -ggdb3 -Wall -Wextra -std=c++11 -o json_test json_test.cc -ljsoncpp

但同样的错误。另一方面,这很好用:

g ++ -ggdb3 -Wall -Wextra -std = c ++ 14 -o json_test json_test.cc -ljsoncpp

Fwiw,这里的版本信息:

jeff@birdsong:tmp $ g++ --version
g++ (Ubuntu 5.2.1-22ubuntu2) 5.2.1 20151010
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

jeff@birdsong:tmp $ clang++ --version
Ubuntu clang version 3.6.2-1 (tags/RELEASE_362/final) (based on LLVM 3.6.2)
Target: x86_64-pc-linux-gnu
Thread model: posix
jeff@birdsong:tmp $ 

0 个答案:

没有答案