C &引用;“未定义引用”;使用tidy library时出错,尤其是;整洁.h“;

C &引用;“未定义引用”;使用tidy library时出错,尤其是;整洁.h“;,c,gcc,tidy,C,Gcc,Tidy,我当前使用的脚本使用tidy library验证无效的XML文件或字符串 测试其运行的示例代码: #include <tidy.h> #include <tidybuffio.h> #include <stdio.h> #include <errno.h> int main(int argc, char **argv ) { const char* input = "&lt;title&gt;Foo&lt;/title

我当前使用的脚本使用
tidy library
验证无效的
XML
文件或字符串

测试其运行的示例代码:

#include <tidy.h>
#include <tidybuffio.h>
#include <stdio.h>
#include <errno.h>

int main(int argc, char **argv )
{
  const char* input = "&lt;title&gt;Foo&lt;/title&gt;&lt;p&gt;Foo!";
  TidyBuffer output = {0};
  TidyBuffer errbuf = {0};
  int rc = -1;
  Bool ok;

  TidyDoc tdoc = tidyCreate();                     // Initialize "document"
  printf( "Tidying:\t%s\n", input );

  ok = tidyOptSetBool( tdoc, TidyXhtmlOut, yes );  // Convert to XHTML
  if ( ok )
    rc = tidySetErrorBuffer( tdoc, &errbuf );      // Capture diagnostics
  if ( rc >= 0 )
    rc = tidyParseString( tdoc, input );           // Parse the input
  if ( rc >= 0 )
    rc = tidyCleanAndRepair( tdoc );               // Tidy it up!
  if ( rc >= 0 )
    rc = tidyRunDiagnostics( tdoc );               // Kvetch
  if ( rc > 1 )                                    // If error, force output.
    rc = ( tidyOptSetBool(tdoc, TidyForceOutput, yes) ? rc : -1 );
  if ( rc >= 0 )
    rc = tidySaveBuffer( tdoc, &output );          // Pretty Print

  if ( rc >= 0 )
  {
    if ( rc > 0 )
      printf( "\nDiagnostics:\n\n%s", errbuf.bp );
    printf( "\nAnd here is the result:\n\n%s", output.bp );
  }
  else
    printf( "A severe error (%d) occurred.\n", rc );

  tidyBufFree( &output );
  tidyBufFree( &errbuf );
  tidyRelease( tdoc );
  return rc;
}
#包括
#包括
#包括
#包括
int main(int argc,字符**argv)
{
const char*input=“titleFoo/titleFoo!”;
TidyBuffer输出={0};
TidyBuffer errbuf={0};
int rc=-1;
布尔ok;
TidyDoc tdoc=tidyCreate();//初始化“文档”
printf(“整理:\t%s\n”,输入);
ok=tidyOptSetBool(tdoc,TidyXhtmlOut,yes);//转换为XHTML
如果(确定)
rc=tidysterorbuffer(tdoc和errbuf);//捕获诊断
如果(rc>=0)
rc=tidyParseString(tdoc,input);//解析输入
如果(rc>=0)
rc=tidyleandrepair(tdoc);//整理一下!
如果(rc>=0)
rc=潮汐不可知论(tdoc);//Kvetch
if(rc>1)//如果出错,则强制输出。
rc=(tidyOptSetBool(tdoc,TidyForceOutput,yes)?rc:-1;
如果(rc>=0)
rc=tidySaveBuffer(tdoc,&output);//漂亮的打印
如果(rc>=0)
{
如果(rc>0)
printf(“\n诊断:\n\n%s”,errbuf.bp);
printf(“\n这是结果:\n\n%s”,output.bp);
}
其他的
printf(“发生严重错误(%d)。\n”,rc);
tidyBufFree&输出;
整洁干净(&errbuf);
潮汐酶(tdoc);
返回rc;
}
跑步时

gcc-I/usr/include/U示例c

我在终端上获得以下输出:

/tmp/cclFfP4I.o:在函数
main'中:
tidy_exa.c:(.text+0x6e):对
tidyCreate'的未定义引用 tidy_exa.c:(.text+0x9e):对
tidyOptSetBool'的未定义引用
tidy_exa.c:(.text+0xba):未定义对
TidySterrorBuffer'的引用 tidy_exa.c:(.text+0xd6):对
tidyParseString'的未定义引用
tidy_exa.c:(.text+0xeb):未定义对
TidyCleanRepair'的引用 tidy_exa.c:(.text+0x100):对
tidyRunDiagnostics'的未定义引用
tidy_exa.c:(.text+0x11f):对
tidyOptSetBool'的未定义引用 tidy_exa.c:(.text+0x149):对
tidySaveBuffer'的未定义引用
tidy_exa.c:(.text+0x1a6):未定义对
TidyBuffee'的引用 tidy_exa.c:(.text+0x1b2):未定义对
TidyBuffee'的引用
tidy_exa.c:(.text+0x1be):对
tidyRelease'的未定义引用 collect2:错误:ld返回了1个退出状态

关于如何解决这个问题的任何想法,或者任何其他库在c/c++中对文件或字符串(无效XML)执行相同的操作


任何建议都将受到欢迎。

您忘记使用
-l
选项链接库

比如说

gcc -I/usr/include/tidy -ltidy tidy_example.c -o example
如果还需要为libs指定特定文件夹,则必须添加
-L
选项,如

gcc -I/usr/include/tidy -L/usr/local/lib/tidy -ltidy tidy_example.c -o example

See可能重复它提到的方法,但似乎没有一种对我有效。或者更明显的是,一个@MikeKinghan在同一个“什么是未定义的引用…”问题中提出的关于库和对象文件的链接顺序。大概他已经忘记了这一点——答案列表的下方有一点。即使我在命令中使用-ltidy,它也会给出相同的输出。对于后面的一个,我在我的“/usr/local/lib”中没有看到一个整洁的文件/目录。首先:libtidy安装在哪里?库应该列在源文件或目标文件之后,而不是之前。在某些系统和某些库中,这并不重要。在其他系统上,这很重要。因此:
gcc-I/usr/include/tidy-tidy\u示例。c-ltidy
将起作用(如果链接器搜索的库目录中有一个
libtidy.a
libtidy.so
-L
选项可以放在
-L
选项之前的任何位置n、 @JonathanLeffler上述gcc-I/usr/include/tidy tidy_示例。c-ltidy确实有效。谢谢你的帮助。但想知道为什么在
tidy_示例之前保留
-ltidy
不起作用?@SilentFlame:肯定还有其他问题涉及到这一点。简单地说,当链接器扫描库时,查找或符号,如果未找到任何当前未定义的符号,则忽略(或可以忽略)库。对于静态库,它会严格忽略它;它不会拉入任何信息。对于共享库,有时链接器会记住定义的内容,如果以后需要共享库定义的符号,它会将库列为依赖项。有时则不会。假设您的tidy库是共享对象,则您的那不是。