环境:使用了一个第三方库mxml,在A.h中引用mxml.h,(第三方库的头文件),A.c中完成实现代码。
编译、运行:编译运行的时候链接第三方库,输出结果正常。
这时候想要将A.c编译成.so,只提供A.h作为头文件供外部调用。
gcc -c A.c
gcc -fPIC -shared A.o -o libmya.so
生成了动态库libmya.so
gcc main.c A.h -L. -lmya -o main
运行可执行文件main的时候报错:
但是我通过nm命令,nm libmya.so
查询我的so,这些函数是在里面的。
为什么so库中存在这些第三方库提供的函数,但是我实际调用的时候却会报错?
你nm命令看到的那些符号的“U”表示未定义的,你可以看到它们前面没有内存地址信息,这些符号是定义在你引入的mxml库中的。
你是在生成可执行程序main的失败报错的吧,如果是在编译的时候再加上-lmxml选项,并使用-L选项指定mxml库所在的目录。
运行时可能会遇到提示找不到
libmxml.so**
库的错误提示,可以把libmxml.so**
库发布到/usr/lib64目录下,或者把libmxml.so**
所在目录配置到/etc/ld.so.conf中,然后执行ldconfig即可。