【问题标题】:Can't link libpqxx in MinGW无法在 MinGW 中链接 libpqxx
【发布时间】:2010-11-24 20:08:04
【问题描述】:

使用 MSYS,我编译了 libpq(来自编译 postgres)。然后我编译了 libpqxx。现在,我想创建一个将使用 libpqxx 的客户端。 libpq 似乎工作正常。而且,我可以用 libpqxx 编译代码。但是,链接 libpq 客户端应用程序失败。

这是我的代码:


#include <pqxx/pqxx>
#include <iostream>
using namespace std;
using namespace pqxx;

int main() {
    connection Conn("dbname=test");
    cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
    return 0;
}

我徒劳地在链接中添加了一堆库,希望它会突然起作用。这是我目前所拥有的:

g++ -IC:\msys\1.0\local\pgsql\include -IC:\msys\1.0\local\include -O0 -g3 -Wall -c -fmessage-length=0 -osrc\Controller.o ..\src\控制器.cpp g++ -LC:\MinGW\lib -LC:\msys\1.0\local\pgsql\lib -LC:\msys\1.0\local\lib -oController.exe src\Controller.o -lws2_32 -lole32 -lpqxx -lpq - loleaut32 -luuid C:\msys\1.0\local\lib/libpqxx.a(connection_base.o):在函数“ZN45_GLOBAL__N__ZN4pqxx16encrypt_passwordERKSsS1_7wait_fdEibP7timeval”中: C:/msys/1.0/home/rsolomon/libpqxx/libpqxx-3.0.2/src/connection_base.cxx:1434:未定义对“select@20”的引用 C:\msys\1.0\local\lib/libpqxx.a(connection_base.o):在函数“ZN4pqxx15connection_base12check_resultERKNS_6resultE”中: C:/msys/1.0/home/rsolomon/libpqxx/libpqxx-3.0.2/src/connection_base.cxx:420:未定义对“select@20”的引用 collect2: ld 返回 1 个退出状态 发生构建错误,构建已停止 消耗时间:1770 毫秒。

我认为 -lws2_32 应该给了我“select@20”。为什么链接器如此自大?

【问题讨论】:

    标签: c++ postgresql mingw libpqxx


    【解决方案1】:

    Unix 链接器传统上从左到右处理库。所以它首先考虑ws2_32,发现它没有多大用处,然后继续pqxx,发现select是未定义的,并且没有被任何后来的库定义。 IOW,尝试将ws2_32 移到命令行末尾。

    【讨论】:

    • 哇!有效。那么, -l 的顺序应该从我首先使用的特定库到最后传递性最强的库吗?我想我很难找到那个。
    • 同一个库我需要两次 -l 吗?
    • Unix 传统上使用 tsort(1) 来计算拓扑顺序,即使它没有被广泛使用......无论如何,是的,如果两者之间存在循环依赖关系,您可能必须添加两次库库 - 如果您的库正确堆叠,您不应该拥有这些库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 2015-04-07
    • 2021-04-04
    相关资源
    最近更新 更多