Linux Apache CGI访问网站无法打开lib

Linux Apache CGI can't open lib when visiting the website

我正在使用 unixODBC 和 Apache CGI 在 Linux 上构建数据库网站。我在测试数据库的查询时出现如下问题

Connect Error
[01000] [unixODBC][Driver Manager]Can't open lib '/usr/local/lib/psqlodbcw.so' : file not found (0)

以上信息出现在我尝试使用Windows访问该网站的另一台计算机上。

http://serverIP/cgi-bin/website.cgi?first=1

奇怪的是,当我运行这个CGI文件直接放在Linux服务器上时,它执行正常。即成功连接数据库并查询输出结果。 isql连接成功也证明可以连接数据库

等价于以下

root@VM-4-11-ubuntu:~# /var/www/cgi-bin/website.cgi
Content-type:text/html

<html>
  <head>
    <title>test button</title>
  </head>
  <body>
    <p>Connected!</p>
    <p>SELECT * FROM people WHERE id = 1;<p>
    <p>id = 1 name = Tom</p>
  </body>
</html>
// -----
root@VM-4-11-ubuntu:~# curl http://localhost/cgi-bin/website.cgi
<html>
  <head>
    <title>test button</title>
  </head>
  <body>
    <p>Connect Error</p>
    <p>[01000] [unixODBC][Driver Manager]Can't open lib '/usr/local/lib/psqlodbcw.so' : file not found (0)</p>
  </body>
</html>

下面是输出错误信息的代码

// In DataBase's constructor
// ...
  V_OD_erg = SQLConnect(V_OD_hdbc, dataSource, SQL_NTS,
                        usrName, SQL_NTS, password, SQL_NTS);
  if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO)) {
    noErr = false;
    printf("<p>Connect Error</p>\n");
    showDBCErr(V_OD_erg);
  }
// ...
void DataBase::showDBCErr(SQLRETURN retCode) {
  HandleDiagnosticRecord(V_OD_hdbc, SQL_HANDLE_DBC, retCode);
}
// ...
void DataBase::HandleDiagnosticRecord(SQLHANDLE hHandle, SQLSMALLINT hType,
                                      RETCODE RetCode) {
  SQLSMALLINT iRec = 0;
  SQLINTEGER iError;
  SQLCHAR wszMessage[1000];
  SQLCHAR wszState[SQL_SQLSTATE_SIZE + 1];

  if (RetCode == SQL_INVALID_HANDLE) {
    printf("<p>Invalid handle!</p>");
    return;
  }

  while (SQLGetDiagRec(hType, hHandle, ++iRec, wszState, &iError, wszMessage,
                       (SQLSMALLINT)(sizeof(wszMessage) / sizeof(SQLCHAR)),
                       (SQLSMALLINT*)NULL) == SQL_SUCCESS) {
    // Hide data truncated..
    if (strcmp((const char*)wszState, "01004")) {
      printf("<p>[%5.5s] %s (%d)</p>", wszState, wszMessage, iError);
    }
  }
}

// in /usr/local/etc/odbcinst.ini
[ODBC]
Trace=Yes
TraceFile=~/unixODBCLog/odbctrace.log

[GaussMPP]
Driver64=/usr/local/lib/psqlodbcw.so
setup=/usr/local/lib/psqlodbcw.so

// in ~/.bashrc
# ...
export LD_LIBRARY_PATH=/usr/local/lib/:$LD_LIBRARY_PATH
export ODBCSYSINI=/usr/local/etc
export ODBCINI=/usr/local/etc/odbc.ini
root@VM-4-11-ubuntu:~# odbcinst -j
unixODBC 2.3.7pre
DRIVERS............: /usr/local/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/local/etc/odbc.ini
FILE DATA SOURCES..: /usr/local/etc/ODBCDataSources
USER DATA SOURCES..: /usr/local/etc/odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8

我不知道如何解决这个问题。如有必要,我可以提供更多信息。

好的,伙计们,我已经解决了这个问题。就像一些程序员老兄说的那样,“通常不要使用 root 用户进行任何类型的开发,这会给你一种错觉,以为一切正常”。当我将 tar 用作 ubuntu(而不是 root)时,系统显示相同的错误“找不到文件”。然后我意识到安装为root的ODBC库可能对普通用户不可用。所以我重新安装为 ubuntu。有效!

谢谢,@Some 程序员,@Alan Birtles,@Stephen Ostermiller