【问题标题】:Using xerces in Eclipse cdt produces linking error在 Eclipse cdt 中使用 xerces 会产生链接错误
【发布时间】:2022-01-20 06:15:05
【问题描述】:

使用 xerces 构建 C++ 应用程序,这是它在构建部分起作用的地方

g++ -I/usr/local/include/xercesc -O0 -g3 -Wall -c -fmessage-length=0 -v -MMD -MP -MF"mypoject/xercesserver.d" -MT"myproject/xercesserver.o" -o "myproject/xercesserver.o" "../myproject/xercesserver.c"
...etc,etc, blah, blah, blah

这里是失败的地方,链接

gcc -L/usr/local/lib -lxerces-c -o "myprojectapp" ./myproject/textfileread.o ./myproject/xercesserver.o
Undefined symbols for architecture x86_64:
  "vtable for __cxxabiv1::__class_type_info", referenced from:
  typeinfo for xercesc_3_2::XMLDeleter in xercesserver.o
NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
"operator delete(void*)", referenced from:
  xercesc_3_2::XMLDeleter::~XMLDeleter() in xercesserver.o
"___cxa_begin_catch", referenced from:
  _main in xercesserver.o
"___cxa_end_catch", referenced from:
  _main in xercesserver.o
"___gxx_personality_v0", referenced from:
  xercesc_3_2::XMLDeleter::~XMLDeleter() in xercesserver.o
  _main in xercesserver.o
  Dwarf Exception Unwind Info (__eh_frame) in xercesserver.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Mac 10.13.1 High Sierra、Xerces 3.2、Eclipse Oxygen 3.a、CDT 9.4.3、gcc g++ 两者

Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 9.0.0 (clang-900.0.39.2)
Target: x86_64-apple-darwin17.2.0
InstalledDir: /Library/Developer/CommandLineTools/usr/bin 

符号链接 g++ -> gcc ,但 /usr/bin 中的二进制文件虽然大小相同。

【问题讨论】:

    标签: eclipse gcc build eclipse-cdt xerces


    【解决方案1】:

    问题源于创建 C++ 项目 C Managed Build 而不是 C++ 项目 C++ Managed Build,因此需要进行下面给出的更正。我开始从事 C 代码项目,后来意识到我需要 xerces 代码,当然是 C++。否则,您只需要添加库,如下图所示。

    请注意,实际文件的名称是 /usr/local/lib 目录中的 libxerces-c.a,但 Eclipse 希望您只提供根名称,即 xerces-c。

    现在对于创建 C 托管构建导致的错误,在这里找到了一个很好的线索:How can I fix g++ Undefined symbols for architecture x86_64 error?

    问题发现这部分是因为 Eclipse 使用 g++ 进行编译,但默认情况下使用 gcc 进行链接。所以问题真的是如何修复gcc,而不是g++,然后解决方法其实就是切换到g++。此外,xerces FAQs 提出了不同解决方案的类似问题。附加的 pix 显示了在 Eclipse 中修复的位置。

    【讨论】:

    • 我可能会补充一点,提到的 xerces 问题是关于链接的,而不是 Eclipse,并且有不同的解决方案,因为根本原因并不相同。
    • 另一个可能犯的细微差别或愚蠢的错误是使用 C++ xerces 代码或 lib 创建文件,但使用 .c 扩展名命名。在这种情况下,即使是 C++ Managed Build 也会使用 gcc 而不是 g++,代码会显示错误并且构建会失败。
    猜你喜欢
    • 2017-12-10
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多