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 = "<title>Foo</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 = "<title>Foo</title><p>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库是共享对象,则您的那不是。