2010-11-21 90 views
3

我有两个项目,一个是使用libpq头文件和可执行文件的库,它链接到我的库和libpq,但不管我如何放入makefile,它只是不链接libpq和aways返回给我一个未定义的引用错误。它链接我的lib好吧。未定义的libpq函数参考

g++ -o MYAPP main.o -L../Libs -lpq -lMYLIB 

libpq.a和libmylib.a都在Libs目录中。
我用nm来检查函数,他们在那里,我改变了-lpq到-lpq_并且编译器抱怨缺少的lib,所以它找到并且理论上是链接,但是找不到引用?

这真的让我感到困扰,它会是什么?

(我的英文不是很好,抱歉)

感谢,
乔纳森

回答

3

我赶紧查了一些postgre头我都飞来飞去的,他们似乎在extern "C"时候不要将自己包裹起来用C++编译器编译。通过在extern "C" { ... }块中包含postgre的头文件包含语句可以解决您的问题吗?

编辑。 我认为问题是这样的:libpq.a and libmylib.a。起初,我在原来的帖子中忽略了这一点,对于噪音感到抱歉。当您将-lpq设置为gcc时,它会尝试进行动态链接。 除非你给一个库目录-L 那里只存在静态版本的库。静态库不能记录他们需要插入哪些其他库。另外,对于静态库,规格顺序非常重要。依赖于其他库的库需要在它们之前列出。通过apt-get安装,您可以安装共享库,以正确记录他们需要链接的其他东西(检查ldd /usr/lib/libpq.so)。因此,在您之前的尝试中,您可能只需要将-lpq-lMYLIB相反并列出libpq需要的其他库。

+0

我添加了extern“C”{#include“libpq-fe.h”}并且没有工作 – Jonathan 2010-11-21 00:41:47

+0

AFAIK,链接顺序与动态库无关,但如果你还没有尝试过,你可以反向'-lpq'和'-lMYLIB'。 – dennycrane 2010-11-21 00:52:39

+0

我这样做了,然后它给了我更多未经验证的错误,但对于libpq中的其他东西,比如kerberus,这让我感到困惑。但现在它正在工作......我所做的就是删除我创建的用于链接目的的Libs目录,然后通过apt-get安装libpq,并让g ++链接到这个新的lib,然后它不会再给我错误。我猜它也与其他图书馆有联系?这对我来说是有点新闻。如果有人解释...... – Jonathan 2010-11-21 01:01:05