如何 link 带有专有 DLL 的包?

How to link a package with a proprietary DLL?

我正在编写一个 Haskell 包,它依赖于专有 DLL。我也使用 stack 工具。该库有 x86 和 x64 版本。根据 this issue 我不能通过修改 .cabal 文件来做到这一点。所以我试图通过更新 Setup.hs 来做到这一点。这是我的设置脚本:

import Distribution.Simple
import Distribution.PackageDescription
import Distribution.Simple.LocalBuildInfo
import System.Directory

updateExtraLibDirs :: LocalBuildInfo -> IO LocalBuildInfo
updateExtraLibDirs localBuildInfo = do
    let packageDescription = localPkgDescr localBuildInfo
        test = head $ testSuites packageDescription
        testBuild = testBuildInfo  test
    dir <- getCurrentDirectory
    print $ length $ testSuites packageDescription
    return localBuildInfo {
        localPkgDescr = packageDescription {
            testSuites = [ test {
                testBuildInfo = testBuild {
                    extraLibDirs = (dir ++ "\lib") : extraLibDirs testBuild,
                    extraLibs = ("txmlconnector64.dll") : extraLibs testBuild
                }
            } ]
        }
    }


main = defaultMainWithHooks simpleUserHooks {
          confHook = \a f -> confHook simpleUserHooks a f >>= updateExtraLibDirs
          }

然后我打电话给:

> stack test

这仍然会导致在测试套件链接期间出现未定义的引用。为什么?

只需两步:

  1. "txmlconnector64.dll"替换为"txmlconnector64"
  2. .cabal 文件中设置 build-type: Custom 以允许它使用您的 Setup.hs