使用 GHC 共享库

var*_*ala 6 linux haskell shared-libraries linker-errors

我正在尝试从 Haskell 源代码创建一个简单的共享库。该库由两个文件组成:Add.hs 和 lib.c。lib.c 提供了初始化和退出 haskell 运行时的函数。

添加.hs

module Add where

foreign export ccall add :: Int -> Int -> Int

add :: Int -> Int -> Int
add a b = a + b
Run Code Online (Sandbox Code Playgroud)

库文件

#include <stdio.h>
#include "HsFFI.h"

#if defined(__GLASGOW_HASKELL__)
#include "Foo_stub.h"
#endif


int add(int a, int b);


void lib_init()
{
    int argc = 2;
    char *argv[] = { "+RTS", "-A32m", NULL };
    char **pargv = argv;

    hs_init(&argc, &pargv);
}


void lib_exit()
{
    hs_exit();
}
Run Code Online (Sandbox Code Playgroud)

我正在使用以下命令构建共享库:

ghc -c Add.hs -dynamic -fPIC -odir ./obj -stubdir ./include
gcc -c lib.c -o ./obj/lib.o -I ./include -I /usr/lib/ghc/include
ghc ./obj/lib.o ./obj/Add.o -dynamic -shared -o libadd.so
Run Code Online (Sandbox Code Playgroud)

这不会给我任何错误。但是,当我尝试将我的主程序与这个库链接时,我得到以下输出:

gcc test.c -o ./obj/test.o -ladd -L. -o test-exe
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_writeTVarzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `reportStackOverflow'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `performMajorGC'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `getRTSStats'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_newMutVarzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stopProfTimer'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `getOrSetSystemEventThreadEventManagerStore'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_makeStablePtrzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_maskUninterruptiblezh'
/usr/bin/ld: ./libadd.so: undefined reference to `hs_exit'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_SRT_15_info'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_ap_5_upd_info'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `getRTSStatsEnabled'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `rtsSupportsBoundThreads'
/usr/bin/ld: /usr/lib/ghc/ghc-prim-0.5.3/libHSghc-prim-0.5.3-ghc8.6.5.so: undefined reference to `stg_newSmallArrayzh'
/usr/bin/ld: ./libadd.so: undefined reference to `rts_mkInt'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_readTVarIOzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_ap_ppp_fast'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `libdwPoolRelease'
/usr/bin/ld: /usr/lib/ghc/ghc-prim-0.5.3/libHSghc-prim-0.5.3-ghc8.6.5.so: undefined reference to `stg_SMALL_MUT_ARR_PTRS_FROZEN_DIRTY_info'
/usr/bin/ld: /usr/lib/ghc/ghc-prim-0.5.3/libHSghc-prim-0.5.3-ghc8.6.5.so: undefined reference to `stg_mkApUpd0zh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_tryTakeMVarzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `newSpark'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_killThreadzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `errorBelch'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_ap_pppv_info'
/usr/bin/ld: ./libadd.so: undefined reference to `rts_checkSchedStatus'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_ap_0_fast'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_gc_unpt_r1'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_ap_pp_fast'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_forkzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `rts_getThreadId'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_SRT_3_info'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_ap_ppv_fast'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `debugBelch'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_ap_pppppp_info'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `resumeThread'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `getNumberOfProcessors'
/usr/bin/ld: /usr/lib/ghc/ghc-prim-0.5.3/libHSghc-prim-0.5.3-ghc8.6.5.so: undefined reference to `stg_cloneSmallMutableArrayzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_clearCCSzh'
/usr/bin/ld: /usr/lib/ghc/ghc-prim-0.5.3/libHSghc-prim-0.5.3-ghc8.6.5.so: undefined reference to `stg_casSmallArrayzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `reportHeapOverflow'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_retryzh'
/usr/bin/ld: ./libadd.so: undefined reference to `rts_lock'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_ap_pppp_fast'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `getOrSetSystemEventThreadIOManagerThreadStore'
/usr/bin/ld: /usr/lib/ghc/ghc-prim-0.5.3/libHSghc-prim-0.5.3-ghc8.6.5.so: undefined reference to `stg_compactAllocateBlockzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_ap_v_info'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_noDuplicatezh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_sel_4_upd_info'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_ap_2_upd_info'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `lockFile'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `newCAF'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_readMVarzh'
/usr/bin/ld: /usr/lib/ghc/ghc-prim-0.5.3/libHSghc-prim-0.5.3-ghc8.6.5.so: undefined reference to `stg_cloneArrayzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_raisezh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `getMonotonicNSec'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `setIOManagerControlFd'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `libdwPoolTake'
/usr/bin/ld: /usr/lib/ghc/ghc-prim-0.5.3/libHSghc-prim-0.5.3-ghc8.6.5.so: undefined reference to `stg_unsafeThawSmallArrayzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `__hscore_set_saved_termios'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_MUT_ARR_PTRS_FROZEN_DIRTY_info'
/usr/bin/ld: ./libadd.so: undefined reference to `rts_getInt'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_ap_ppppp_info'
/usr/bin/ld: /usr/lib/ghc/ghc-prim-0.5.3/libHSghc-prim-0.5.3-ghc8.6.5.so: undefined reference to `stg_compactGetFirstBlockzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_waitReadzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_ap_ppp_info'
/usr/bin/ld: /usr/lib/ghc/integer-gmp-1.0.2.0/libHSinteger-gmp-1.0.2.0-ghc8.6.5.so: undefined reference to `stg_decodeDoublezuInt64zh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_gc_unbx_r1'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_ap_4_upd_info'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_getSparkzh'
/usr/bin/ld: /usr/lib/ghc/ghc-prim-0.5.3/libHSghc-prim-0.5.3-ghc8.6.5.so: undefined reference to `stg_newBCOzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_ap_6_upd_info'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_ap_pv_fast'
/usr/bin/ld: /usr/lib/ghc/ghc-prim-0.5.3/libHSghc-prim-0.5.3-ghc8.6.5.so: undefined reference to `stg_casArrayzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_catchRetryzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_putMVarzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_ap_pppppp_fast'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_unsafeThawArrayzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `backtraceFree'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_unmaskAsyncExceptionszh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_labelThreadzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `getOrSetSystemTimerThreadIOManagerThreadStore'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `setNumCapabilities'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `cmp_thread'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_bh_upd_frame_info'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `getOrSetSystemTimerThreadEventManagerStore'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_maskAsyncExceptionszh'
/usr/bin/ld: /usr/lib/ghc/ghc-prim-0.5.3/libHSghc-prim-0.5.3-ghc8.6.5.so: undefined reference to `stg_copyArrayzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `rts_setMainThread'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_gc_pppp'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `hs_spt_key_count'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_ap_7_upd_info'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `setTimerManagerControlFd'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `libdwPoolClear'
/usr/bin/ld: ./libadd.so: undefined reference to `stg_ap_pp_info'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_gc_f1'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `suspendThread'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_SRT_9_info'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_SRT_4_info'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_getThreadAllocationCounterzh'
/usr/bin/ld: /usr/lib/ghc/ghc-prim-0.5.3/libHSghc-prim-0.5.3-ghc8.6.5.so: undefined reference to `stg_newArrayArrayzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_takeMVarzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_SRT_10_info'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `startProfTimer'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_ap_pppp_info'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `hs_free_stable_ptr'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_sel_3_upd_info'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_SRT_6_info'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_CHARLIKE_closure'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `hs_spt_keys'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_setThreadAllocationCounterzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_yieldzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_MUT_ARR_PTRS_DIRTY_info'
/usr/bin/ld: /usr/lib/ghc/ghc-prim-0.5.3/libHSghc-prim-0.5.3-ghc8.6.5.so: undefined reference to `stg_copyMutableArrayArrayzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_deRefWeakzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `rts_disableThreadAllocationLimit'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_newMVarzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_waitWritezh'
/usr/bin/ld: /usr/lib/ghc/ghc-prim-0.5.3/libHSghc-prim-0.5.3-ghc8.6.5.so: undefined reference to `stg_isMutableByteArrayPinnedzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_SRT_1_info'
/usr/bin/ld: /usr/lib/ghc/ghc-prim-0.5.3/libHSghc-prim-0.5.3-ghc8.6.5.so: undefined reference to `stg_SMALL_MUT_ARR_PTRS_DIRTY_info'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_ap_pv_info'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `setIOManagerWakeupFd'
/usr/bin/ld: /usr/lib/ghc/ghc-prim-0.5.3/libHSghc-prim-0.5.3-ghc8.6.5.so: undefined reference to `stg_compactGetNextBlockzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_newArrayzh'
/usr/bin/ld: /usr/lib/ghc/ghc-prim-0.5.3/libHSghc-prim-0.5.3-ghc8.6.5.so: undefined reference to `stg_copyMutableArrayzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `performGC'
/usr/bin/ld: /usr/lib/ghc/ghc-prim-0.5.3/libHSghc-prim-0.5.3-ghc8.6.5.so: undefined reference to `stg_compactContainsAnyzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_addCFinalizzerToWeakzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_SRT_2_info'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_catchzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `getProcessElapsedTime'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `__hscore_get_saved_termios'
/usr/bin/ld: /usr/lib/ghc/ghc-prim-0.5.3/libHSghc-prim-0.5.3-ghc8.6.5.so: undefined reference to `stg_freezzeArrayzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_catchSTMzh'
/usr/bin/ld: /usr/lib/ghc/ghc-prim-0.5.3/libHSghc-prim-0.5.3-ghc8.6.5.so: undefined reference to `stg_compactNewzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_sel_0_upd_info'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `forkOS_createThread'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_SRT_16_info'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_gc_d1'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_IND_STATIC_info'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_newPinnedByteArrayzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_gc_noregs'
/usr/bin/ld: /usr/lib/ghc/ghc-prim-0.5.3/libHSghc-prim-0.5.3-ghc8.6.5.so: undefined reference to `stg_getApStackValzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `hs_spt_lookup'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_SRT_5_info'
/usr/bin/ld: ./libadd.so: undefined reference to `foreignExportStablePtr'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_SRT_8_info'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_traceMarkerzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_deRefStablePtrzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `RtsFlags'
/usr/bin/ld: /usr/lib/ghc/ghc-prim-0.5.3/libHSghc-prim-0.5.3-ghc8.6.5.so: undefined reference to `stg_freezzeSmallArrayzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_sel_2_upd_info'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_finalizzeWeakzh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_forkOnzh'
/usr/bin/ld: /usr/lib/ghc/ghc-prim-0.5.3/libHSghc-prim-0.5.3-ghc8.6.5.so: undefined reference to `stg_compactResizzezh'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `getProgArgv'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `unlockFile'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `_assertFail'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_ap_p_info'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `getFullProgArgv'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `stg_SRT_7_info'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `setProgArgv'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `shutdownHaskellAndSignal'
/usr/bin/ld: /usr/lib/ghc/base-4.12.0.0/libHSbase-4.12.0.0-ghc8.6.5.so: undefined reference to `shutdownHaskellAndExit'
/usr/bin/ld: /usr/lib/ghc/ghc-prim-0.5.3/libHSghc-prim-0.5.3-ghc8.6.5.so: undefined reference to `stg_compactAddWithSharingzh'
/usr/bi

var*_*ala 5

经过更多资源后,我发现共享库必须显式链接到 Haskell rts 库。该文件是/usr/lib/ghc/rts/libHSrts-ghc8.6.5.so。我将构建库的命令更改为以下内容:

ghc ./obj/lib.o ./obj/Add.o -dynamic -shared -lHSrts-ghc8.6.5 -L/usr/lib/ghc/rts -o libadd.so
Run Code Online (Sandbox Code Playgroud)

并使用以下命令构建了加载该库的测试程序:

gcc test.c -o ./obj/test.o -ladd -L. -Wl,-rpath,. -o test-exe
Run Code Online (Sandbox Code Playgroud)

这很好用!