2012-10-24 80 views
5

奧拉所有的聰明人。 我正面臨一個我正在嘗試解決但未能解決的問題。我試圖安裝pg gem在服務器上安裝有Omnibus Chef 012bpg寶石未能安裝在綜合廚師安裝

基本上這個問題已經有報道了(http://tickets.opscode.com/browse/COOK-1406)米尋找一個解決方案,如果有的話 - 解決方法建議從Opscode Ubuntu回購安裝軟件包 - 但那些與紅寶石1.8 - 我希望我不必再繼續爲什麼我不願意這樣做:)

安裝PG寶石時,我得到的錯誤是:

$ sudo /opt/chef/embedded/bin/gem install pg 
Building native extensions. This could take a while... 
ERROR: Error installing pg: 
    ERROR: Failed to build gem native extension. 

     /opt/chef/embedded/bin/ruby extconf.rb 
checking for pg_config... yes 
Using config values from /usr/bin/pg_config 
checking for libpq-fe.h... yes 
checking for libpq/libpq-fs.h... yes 
checking for pg_config_manual.h... yes 
checking for PQconnectdb() in -lpq... no 
checking for PQconnectdb() in -llibpq... no 
checking for PQconnectdb() in -lms/libpq... no 
Can't find the PostgreSQL client library (libpq) 
*** extconf.rb failed *** 
Could not create Makefile due to some reason, probably lack of 
necessary libraries and/or headers. Check the mkmf.log file for more 
details. You may need configuration options. 

Provided configuration options: 
    --with-opt-dir 
    --with-opt-include 
    --without-opt-include=${opt-dir}/include 
    --with-opt-lib 
    --without-opt-lib=${opt-dir}/lib 
    --with-make-prog 
    --without-make-prog 
    --srcdir=. 
    --curdir 
    --ruby=/opt/chef/embedded/bin/ruby 
    --with-pg 
    --without-pg 
    --with-pg-dir 
    --without-pg-dir 
    --with-pg-include 
    --without-pg-include=${pg-dir}/include 
    --with-pg-lib 
    --without-pg-lib=${pg-dir}/lib 
    --with-pg-config 
    --without-pg-config 
    --with-pg_config 
    --without-pg_config 
    --with-pqlib 
    --without-pqlib 
    --with-libpqlib 
    --without-libpqlib 
    --with-ms/libpqlib 
    --without-ms/libpqlib 


Gem files will remain installed in /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/pg-0.14.1 for inspection. 
Results logged to /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/pg-0.14.1/ext/gem_make.out 

在mkmf.log斷裂活動位是FO llows:

have_library: checking for PQconnectdb() in -lpq... -------------------- no 

"gcc -o conftest -I/opt/chef/embedded/include/ruby-1.9.1/x86_64-linux -I/opt/chef/embedded/include/ruby-1.9.1/ruby/backward -I/opt/chef/embedded/include/ruby-1.9.1 -I. -I/opt/chef/embedded/include -I/usr/include/postgresql -I/opt/chef/embedded/include -fPIC conftest.c -L. -L/opt/chef/embedded/lib -Wl,-R/opt/chef/embedded/lib -L/opt/chef/embedded/lib -Wl,-R/opt/chef/embedded/lib -L. -Wl,-rpath,/opt/chef/embedded/lib -L/opt/chef/embedded/lib -rdynamic -Wl,-export-dynamic -L/usr/lib  -Wl,-R -Wl,/opt/chef/embedded/lib -L/opt/chef/embedded/lib -lruby -lpq -lpthread -lrt -ldl -lcrypt -lm -lc" 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
/usr/lib/libpq.so: undefined reference to `[email protected]_1.0.0' 
collect2: ld returned 1 exit status 
checked program was: 
/* begin */ 
1: #include "ruby.h" 
2: 
3: #include <libpq-fe.h> 
4: 
5: /*top*/ 
6: int main() {return 0;} 
7: int t() { void ((*volatile p)()); p = (void ((*)()))PQconnectdb; return 0; } 
/* end */ 

"gcc -o conftest -I/opt/chef/embedded/include/ruby-1.9.1/x86_64-linux -I/opt/chef/embedded/include/ruby-1.9.1/ruby/backward -I/opt/chef/embedded/include/ruby-1.9.1 -I. -I/opt/chef/embedded/include -I/usr/include/postgresql -I/opt/chef/embedded/include -fPIC conftest.c -L. -L/opt/chef/embedded/lib -Wl,-R/opt/chef/embedded/lib -L/opt/chef/embedded/lib -Wl,-R/opt/chef/embedded/lib -L. -Wl,-rpath,/opt/chef/embedded/lib -L/opt/chef/embedded/lib -rdynamic -Wl,-export-dynamic -L/usr/lib  -Wl,-R -Wl,/opt/chef/embedded/lib -L/opt/chef/embedded/lib -lruby -lpq -lpthread -lrt -ldl -lcrypt -lm -lc" 
conftest.c: In function ‘t’: 
conftest.c:7:1: error: too few arguments to function ‘PQconnectdb’ 
/usr/include/postgresql/libpq-fe.h:243:16: note: declared here 
checked program was: 
/* begin */ 
1: #include "ruby.h" 
2: 
3: #include <libpq-fe.h> 
4: 
5: /*top*/ 
6: int main() {return 0;} 
7: int t() { PQconnectdb(); return 0; } 
/* end */ 

-------------------- 

have_library: checking for PQconnectdb() in -llibpq... -------------------- no 

"gcc -o conftest -I/opt/chef/embedded/include/ruby-1.9.1/x86_64-linux -I/opt/chef/embedded/include/ruby-1.9.1/ruby/backward -I/opt/chef/embedded/include/ruby-1.9.1 -I. -I/opt/chef/embedded/include -I/usr/include/postgresql -I/opt/chef/embedded/include -fPIC conftest.c -L. -L/opt/chef/embedded/lib -Wl,-R/opt/chef/embedded/lib -L/opt/chef/embedded/lib -Wl,-R/opt/chef/embedded/lib -L. -Wl,-rpath,/opt/chef/embedded/lib -L/opt/chef/embedded/lib -rdynamic -Wl,-export-dynamic -L/usr/lib  -Wl,-R -Wl,/opt/chef/embedded/lib -L/opt/chef/embedded/lib -lruby -llibpq -lpthread -lrt -ldl -lcrypt -lm -lc" 
/usr/bin/ld: cannot find -llibpq 
collect2: ld returned 1 exit status 
checked program was: 
/* begin */ 
1: #include "ruby.h" 
2: 
3: #include <libpq-fe.h> 
4: 
5: /*top*/ 
6: int main() {return 0;} 
7: int t() { void ((*volatile p)()); p = (void ((*)()))PQconnectdb; return 0; } 
/* end */ 

"gcc -o conftest -I/opt/chef/embedded/include/ruby-1.9.1/x86_64-linux -I/opt/chef/embedded/include/ruby-1.9.1/ruby/backward -I/opt/chef/embedded/include/ruby-1.9.1 -I. -I/opt/chef/embedded/include -I/usr/include/postgresql -I/opt/chef/embedded/include -fPIC conftest.c -L. -L/opt/chef/embedded/lib -Wl,-R/opt/chef/embedded/lib -L/opt/chef/embedded/lib -Wl,-R/opt/chef/embedded/lib -L. -Wl,-rpath,/opt/chef/embedded/lib -L/opt/chef/embedded/lib -rdynamic -Wl,-export-dynamic -L/usr/lib  -Wl,-R -Wl,/opt/chef/embedded/lib -L/opt/chef/embedded/lib -lruby -llibpq -lpthread -lrt -ldl -lcrypt -lm -lc" 
conftest.c: In function ‘t’: 
conftest.c:7:1: error: too few arguments to function ‘PQconnectdb’ 
/usr/include/postgresql/libpq-fe.h:243:16: note: declared here 
checked program was: 
/* begin */ 
1: #include "ruby.h" 
2: 
3: #include <libpq-fe.h> 
4: 
5: /*top*/ 
6: int main() {return 0;} 
7: int t() { PQconnectdb(); return 0; } 
/* end */ 

-------------------- 

have_library: checking for PQconnectdb() in -lms/libpq... -------------------- no 

"gcc -o conftest -I/opt/chef/embedded/include/ruby-1.9.1/x86_64-linux -I/opt/chef/embedded/include/ruby-1.9.1/ruby/backward -I/opt/chef/embedded/include/ruby-1.9.1 -I. -I/opt/chef/embedded/include -I/usr/include/postgresql -I/opt/chef/embedded/include -fPIC conftest.c -L. -L/opt/chef/embedded/lib -Wl,-R/opt/chef/embedded/lib -L/opt/chef/embedded/lib -Wl,-R/opt/chef/embedded/lib -L. -Wl,-rpath,/opt/chef/embedded/lib -L/opt/chef/embedded/lib -rdynamic -Wl,-export-dynamic -L/usr/lib  -Wl,-R -Wl,/opt/chef/embedded/lib -L/opt/chef/embedded/lib -lruby -lms/libpq -lpthread -lrt -ldl -lcrypt -lm -lc" 
/usr/bin/ld: cannot find -lms/libpq 
collect2: ld returned 1 exit status 
checked program was: 
/* begin */ 
1: #include "ruby.h" 
2: 
3: #include <libpq-fe.h> 
4: 
5: /*top*/ 
6: int main() {return 0;} 
7: int t() { void ((*volatile p)()); p = (void ((*)()))PQconnectdb; return 0; } 
/* end */ 

"gcc -o conftest -I/opt/chef/embedded/include/ruby-1.9.1/x86_64-linux -I/opt/chef/embedded/include/ruby-1.9.1/ruby/backward -I/opt/chef/embedded/include/ruby-1.9.1 -I. -I/opt/chef/embedded/include -I/usr/include/postgresql -I/opt/chef/embedded/include -fPIC conftest.c -L. -L/opt/chef/embedded/lib -Wl,-R/opt/chef/embedded/lib -L/opt/chef/embedded/lib -Wl,-R/opt/chef/embedded/lib -L. -Wl,-rpath,/opt/chef/embedded/lib -L/opt/chef/embedded/lib -rdynamic -Wl,-export-dynamic -L/usr/lib  -Wl,-R -Wl,/opt/chef/embedded/lib -L/opt/chef/embedded/lib -lruby -lms/libpq -lpthread -lrt -ldl -lcrypt -lm -lc" 
conftest.c: In function ‘t’: 
conftest.c:7:1: error: too few arguments to function ‘PQconnectdb’ 
/usr/include/postgresql/libpq-fe.h:243:16: note: declared here 
checked program was: 
/* begin */ 
1: #include "ruby.h" 
2: 
3: #include <libpq-fe.h> 
4: 
5: /*top*/ 
6: int main() {return 0;} 
7: int t() { PQconnectdb(); return 0; } 
/* end */ 

-------------------- 

我認爲這個問題是PG寶石針對不同的LIB一個比PostgreSQL的反對,編譯失敗聯繫在一起。我只是想知道是否有什麼我可以做的解決這個問題? 任何驚人的聰明頭腦? 乾杯

回答

3

我能夠通過下載postgresql源代碼來安裝pg gem,並通過構建vs/opt/chef/embedded庫來編譯它。這是不是最佳的,但它應該工作(警告:我還沒有配方或Ruby程序試了一下):

apt-get install -y build-essential 
apt-get build-dep -y postgresql 
wget http://ftp.postgresql.org/pub/source/v9.2.1/postgresql-9.2.1.tar.gz 
tar -zxvf postgresql-9.2.1.tar.gz 
cd postgresql-9.2.1 
export MAJOR_VER=9.2 
./configure \ 
    --prefix=/opt/chef/embedded \ 
    --mandir=/opt/chef/embedded/share/postgresql/${MAJOR_VER}/man \ 
    --docdir=/opt/chef/embedded/share/doc/postgresql-doc-${MAJOR_VER} \ 
    --sysconfdir=/etc/postgresql-common \ 
    --datarootdir=/opt/chef/embedded/share/ \ 
    --datadir=/opt/chef/embedded/share/postgresql/${MAJOR_VER} \ 
    --bindir=/opt/chef/embedded/lib/postgresql/${MAJOR_VER}/bin \ 
    --libdir=/opt/chef/embedded/lib/ \ 
    --libexecdir=/opt/chef/embedded/lib/postgresql/ \ 
    --includedir=/opt/chef/embedded/include/postgresql/ \ 
    --enable-nls \ 
    --enable-integer-datetimes \ 
    --enable-thread-safety \ 
    --enable-debug \ 
    --with-gnu-ld \ 
    --with-pgport=5432 \ 
    --with-openssl \ 
    --with-libedit-preferred \ 
    --with-includes=/opt/chef/embedded/include \ 
    --with-libs=/opt/chef/embedded/lib 
make 
sudo make install 
sudo /opt/chef/embedded/bin/gem install pg -- --with-pg-config=/opt/chef/embedded/lib/postgresql/9.2/bin/pg_config 

https://gist.github.com/3954641

+0

這就是我們最終做的。但我們不喜歡這個,原因有兩個: 1.)每個Postgres升級意味着重新編譯 2.)在postgres食譜中獲得這個工作將需要很多的改變,並且通常會弄巧成拙。 儘管如此,謝謝你的回答 – gyre

+0

是的,這是完全次優的。這只是一個問題,如果你想在Chef中使用pg gem,比如在Opscode的postgresql數據庫和用戶管理的數據庫食譜資源中。如果您僅在應用程序中使用pg,則不需要這樣做,只需在您的應用程序使用的Ruby下安裝gem(我們不建議在omnibus軟件包中使用Ruby)。 – jtimberman

+0

也就是說,我們不推薦Chef的紅寶石爲您的應用程序,只爲廚師:-)。 – jtimberman

1

嘗試增加「-lssl -lcrypto」而編制。 編譯基於openssl的應用程序時,它爲我工作