当前位置: 首页 > 工具软件 > Yesod > 使用案例 >

heroku创建linux主机,将Yesod部署到Heroku,无法静态构建

濮赤岩
2023-12-01

我是Yesod的新手,无法静态构建Yesod,因此可以部署到Heroku。

我已更改默认的.cabal文件以反映静态编译

if flag(production)

cpp-options: -DPRODUCTION

ghc-options: -Wall -threaded -O2 -static -optl-static

else

ghc-options: -Wall -threaded -O0

而且它不再构建。我收到一堆警告,然后是许多未定义的引用,如下所示:

Linking dist/build/personal-website/personal-website ...

/usr/lib/ghc-7.0.3/libHSrts_thr.a(Linker.thr_o): In function

`internal_dlopen':

Linker.c:(.text+0x407): warning: Using 'dlopen' in statically linked

applications requires at runtime the shared libraries from the glibc

version used for linking

/usr/lib/ghc-7.0.3/unix-2.4.2.0/libHSunix-2.4.2.0.a(HsUnix.o): In

function `__hsunix_getpwent':

HsUnix.c:(.text+0xa1): warning: Using 'getpwent' in statically linked

applications requires at runtime the shared libraries from the glibc

version used for linking

/usr/lib/ghc-7.0.3/unix-2.4.2.0/libHSunix-2.4.2.0.a(HsUnix.o): In

function `__hsunix_getpwnam_r':

HsUnix.c:(.text+0xb1): warning: Using 'getpwnam_r' in statically

linked applications requires at runtime the shared libraries from the

glibc version used for linking

/usr/lib/libpq.a(thread.o): In function `pqGetpwuid':

(.text+0x15): warning: Using 'getpwuid_r' in statically linked

applications requires at runtime the shared libraries from the glibc

version used for linking

/usr/lib/libpq.a(ip.o): In function `pg_getaddrinfo_all':

(.text+0x31): warning: Using 'getaddrinfo' in statically linked

applications requires at runtime the shared libraries from the glibc

version used for linking

/usr/lib/ghc-7.0.3/site-local/network-2.3.0.2/

libHSnetwork-2.3.0.2.a(BSD__63.o): In function `sD3z_info':

(.text+0xe4): warning: Using 'gethostbyname' in statically linked

applications requires at runtime the shared libraries from the glibc

version used for linking

/usr/lib/ghc-7.0.3/site-local/network-2.3.0.2/

libHSnetwork-2.3.0.2.a(BSD__164.o): In function `sFKc_info':

(.text+0x12d): warning: Using 'getprotobyname' in statically linked

applications requires at runtime the shared libraries from the glibc

version used for linking

/usr/lib/ghc-7.0.3/site-local/network-2.3.0.2/

libHSnetwork-2.3.0.2.a(BSD__155.o): In function `sFDs_info':

(.text+0x4c): warning: Using 'getservbyname' in statically linked

applications requires at runtime the shared libraries from the glibc

version used for linking

/usr/lib/libpq.a(fe-misc.o): In function `pqSocketCheck':

(.text+0xa2d): undefined reference to `SSL_pending'

/usr/lib/libpq.a(fe-secure.o): In function `SSLerrmessage':

(.text+0x31): undefined reference to `ERR_get_error'

/usr/lib/libpq.a(fe-secure.o): In function `SSLerrmessage':

(.text+0x41): undefined reference to `ERR_reason_error_string'

/usr/lib/libpq.a(fe-secure.o): In function `initialize_SSL':

(.text+0x2f8): undefined reference to `SSL_check_private_key'

/usr/lib/libpq.a(fe-secure.o): In function `initialize_SSL':

(.text+0x3c0): undefined reference to `SSL_CTX_load_verify_locations'

(... snip ...)

如果我仅使用just进行编译,-static而没有进行-optl-static

任何编译,则一切正常,但是当尝试在Heroku上启动时,应用程序崩溃。

2011-12-28T01:20:51+00:00 heroku[web.1]: Starting process with command

`./dist/build/personal-website/personal-website -p 41083`

2011-12-28T01:20:51+00:00 app[web.1]: ./dist/build/personal-website/

personal-website: error while loading shared libraries: libgmp.so.10:

cannot open shared object file: No such file or directory

2011-12-28T01:20:52+00:00 heroku[web.1]: State changed from starting

to crashed

我尝试按照此处的建议将libgmp.so.10添加到LD_LIBRARY_PATH

,然后出现以下错误:

2011-12-28T01:31:23+00:00 app[web.1]: ./dist/build/personal-website/

personal-website: /lib/libc.so.6: version `GLIBC_2.14' not found

(required by ./dist/build/personal-website/personal-website)

2011-12-28T01:31:23+00:00 app[web.1]: ./dist/build/personal-website/

personal-website: /lib/libc.so.6: version `GLIBC_2.14' not found

(required by /app/dist/build/personal-website/libgmp.so.10)

2011-12-28T01:31:25+00:00 heroku[web.1]: State changed from starting

to crashed

2011-12-28T01:31:25+00:00 heroku[web.1]: Process exited

似乎我要针对的libc版本不同。我也尝试像对libgmp一样将libc添加到库批次中,但是当应用程序在Heroku端启动时,这会导致分段错误。

在我的PC上一切正常。我正在使用ghc 7.0.3运行64位archlinux。

Yesod官方博客上的博客文章看起来很简单,但是我对此感到困惑。谁有想法?如果有一种方法可以在 不进行 静态构建的情况下使它正常工作,那么我也对此持开放态度。

编辑

每个Employed Russians答案我做了以下修复。

首先在lib项目目录下创建一个新目录,然后将缺少的共享库复制到其中。您可以通过运行获取此信息ldd

path/to/executable,并heroku run ldd path/to/executable和比较输出。

然后我这样做了heroku config:add LD_LIBRARY_PATH=./lib,当启动应用程序时,动态链接器将在新的lib目录中查找库。

最后,我创建了一个ubuntu 11.10虚拟机,并从那里构建并部署到Heroku,它具有足够老的glibc,可以在Heroku主机上运行。

编辑:从那以后我就在Yesod Wiki上写了一个教程

 类似资料: