如何在代码块中针对动态库(而不是静态库)进行编译
我正在使用代码块来编译一个使用 mysql 的应用程序。在 CentOS 6 下,这个应用程序编译得很好(我假设使用了 .so 文件)。在 CentOS 5 下,除非我转到“项目|构建选项|链接器|链接库”并添加:
/usr/lib/mysql/libmysqlclient.a
否则我会收到链接错误,例如
*myfile.c|87|undefined reference to `mysql_use_result'|*
这是否意味着在 CentOS 6 下链接器正在使用动态 .so 文件,但在 CentOS 5 下它使用静态 .a 文件?
有没有办法配置我的项目,以便它也使用动态 .so 文件链接?
我还必须将“libresolv”和“libssl”添加到链接器库中,否则会出现很多错误。 (在 CentOS 6 下我不这样做)。这是同样的问题吗?
I'm using codeblocks to compile an app which uses mysql. Under CentOS 6 this app compiles fine (and I assumed used the .so file). Under CentOS 5 this same project file won't compile unless I go the to Project|Build Options|Linker|Link Libraries and add:
/usr/lib/mysql/libmysqlclient.a
Otherwise I get linking errors like
*myfile.c|87|undefined reference to `mysql_use_result'|*
Does that mean under CentOS 6 the linker is using the dynamic .so file, but under CentOS 5 it's using the static .a file?
Is there a way to configure my project so that it links using the dynamic .so file too?
I also have to add "libresolv" and "libssl" to the linker libraries or I got lots of errors. (And under CentOS 6 I don't). Is this the same problem?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
你这里有两个问题。
首先,链接mysql的正确方法是在链接行添加
-lmysqlclient
,而不是尝试直接链接静态库。当您将-lx
添加到链接行时,链接器将在LDPATH
中搜索名为libx.so
的文件(如果是动态链接)或libx.a
(如果是静态链接)。您应该仔细检查
libmysqlclient.so
是否在LDPATH
中并且是兼容的架构(请记住 64 位与 32 位问题)。在 CentOS 6 下您还需要添加
-lresolv
和-lssl
的原因是 MySQL 库不再自动将它们拉入 - 在以前的版本中,它总是会,但在 CentOS 6 中却没有。一般来说,您可以使用pkg-config
来查看链接某个库所需的内容(或者查看其.la
文件,如果它安装了)。您还可以使用libtool
进行链接,但我不建议这样做。You have two issues here.
The first is that the correct way to link against mysql is to add
-lmysqlclient
to the link line, instead of attempting to link the static library directly. When you add-lx
to the link line, the linker will searchLDPATH
for a file namedlibx.so
(if a dynamic link) orlibx.a
(if a static link).You should double-check that
libmysqlclient.so
is in theLDPATH
and is a compatible architecture (keep in mind 64-bit vs 32-bit issues).The reason you need to add
-lresolv
and-lssl
as well under CentOS 6 is that the MySQL library no longer automatically pulls them in - in previous versions, it always would, but in CentOS 6 it properly does not. Generally you can usepkg-config
to see what you need to link a certain library (or look at its.la
file, if it installed one). You could also uselibtool
to do the linking, but I don't recommend that.