簡體   English   中英

Linux Apache CGI訪問網站打不開lib

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

我在Linux上使用unixODBC和Apache CGI搭建數據庫網站,測試數據庫查詢時出現如下問題。

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

奇怪的是,當我直接在Linux服務器上運行這個CGI文件時,它執行正常。 即成功連接數據庫,查詢到output的結果。 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>

下面是代碼到output的錯誤信息

// 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM