多重定义的符号:mysqlclient、pthread-win32

Multiply defined symbols: mysqlclient, pthread-win32

继续我的移植项目...尝试使用 Visual Studio 2013 Pro 在 windows 上运行 Linux C++ 应用程序。

这是一个多线程应用,所以我也带了pthread-win32 into the mix. It also uses MySQL, so I've installed the binary 32 bit MySQL C Connector library

在 VS 尝试 link 之前一切正常。然后我得到这个:

pthreadVSE2.lib(pthreadVSE2.dll) : error LNK2005: _pthread_exit already defined in mysqlclient.lib(my_winthread.obj)
pthreadVSE2.lib(pthreadVSE2.dll) : error LNK2005: _pthread_join already defined in mysqlclient.lib(my_winthread.obj)
pthreadVSE2.lib(pthreadVSE2.dll) : error LNK2005: _pthread_create already defined in mysqlclient.lib(my_winthread.obj)

原来 MySQL 开发者 运行 遇到了同样的问题(windows 上缺少 pthreads),所以他们将 pthread 库的一部分滚动到他们的库中(或滚动他们自己的具有相同的功能 names/signatures - 我没仔细看。

但这只是其中的一部分 - 我尝试从 link 中删除 pthread-win32,我想也许 mysqlclient 库中嵌入了所有的 pthreads - 但这会产生很多未解析的符号。

关于如何解决这个问题有什么建议吗?完整的 windows 开发新手在这里,所以没有建议是愚蠢的!

谢谢

好的,如果有人遇到同样的问题,下面是我的解决方法。我进入了 MySQL 连接器源代码并重命名了多重定义的函数并重新编译了库。

pthread_exit() renamed to mysql_pthread_exit()
pthread_join() renamed to mysql_pthread_join()
pthread_create() renamed to mysql_pthread_create()

声明在 include/my_pthread.h 中,实现在 mysys/my_winthread.c 中,它们不会在库中的任何地方调用。

这允许干净的编译 & link。 MySQL 内容不在我这段代码的 multi-threaded 部分,它似乎工作正常。

这不是一个理想的解决方案,因为我现在必须使用 MySQL 连接器库的 mod 化版本,并且 re-do mod 每当新版本出来了。但目前有效。