[英]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.