首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用已建库dll的Kotlin/本机Windows cinterop

使用已建库dll的Kotlin/本机Windows cinterop
EN

Stack Overflow用户
提问于 2019-11-30 01:11:38
回答 2查看 1.1K关注 0票数 2

我使用Windows来遵循Kotlin-本机libcurl示例,这里是https://kotlinlang.org/docs/tutorials/native/curl.html

不幸的是,这是一个比我想象的更大的挑战。我一直在学习如何使用CMake等工具从源代码编译windows上的C二进制文件,并遵循本教程在Windows:https://jonnyzzz.com/blog/2018/10/29/kn-libcurl-windows/上构建libcurl

在对Windows上的cinterop .def文件进行了几天的尝试和错误之后,并使用compilerOpts指向我构建的库中的curl头文件,我碰到了一堵砖墙。

我似乎无法让Gradle识别dll文件。任务:linkDebugExecutableMingw‘不断失败。我不知道我应该把dll文件放在哪里。我尝试将它放到exe旁边的build output文件夹中,但仍然无法编译,出现了以下错误:

代码语言:javascript
复制
C:\Users\yous\.konan\dependencies\msys2-mingw-w64-x86_64-clang-llvm-lld-compiler_rt-8.0.1\bin\ld: C:\Users\yous\AppData\Local\Temp\konan_temp6326583690522756621\result.o:out:(.rdata$.refptr.knifunptr_sample35_curl_easy_strerror[.refptr.knifunptr_sample35_curl_easy_strerror]+0x0): undefined reference to `knifunptr_sample35_curl_easy_strerror'

以及类似的头文件错误列表,最后的消息是:

代码语言:javascript
复制
e: C:\Users\yabde\.konan\dependencies\msys2-mingw-w64-x86_64-clang-llvm-lld-compiler_rt-8.0.1/bin/clang++ invocation reported errors

这是在我成功地定位了头文件之后。我相信这是一个与dll文件不包括的问题。

下面是我相关的Gradle构建脚本:

代码语言:javascript
复制
mingwX64("mingw") {
        compilations.main {
            cinterops {
                libcurl {
                    // Def-file describing the native API.
                    // The default path is src/nativeInterop/cinterop/<interop-name>.def
                    defFile project.file("src/nativeInterop/cinterop/libcurl.def")

                    // Package to place the Kotlin API generated.
                    packageName 'libcurl'

                    // Options to be passed to compiler by cinterop tool.
                    compilerOpts '-Isrc\\nativeInterop\\cinterop\\libcurl-vc-x64-release-dll-ipv6-sspi-winssl\\include -o libcurl'
                    //linkerOpts '-Isrc\\nativeInterop\\cinterop\\libcurl-vc-x64-release-dll-ipv6-sspi-winssl\\bin'

                    // Directories for header search (an analogue of the -I<path> compiler option).
                    //includeDirs.allHeaders("path1", "path2")

                    // Additional directories to search headers listed in the 'headerFilter' def-file option.
                    // -headerFilterAdditionalSearchPrefix command line option analogue.
                    includeDirs.headerFilterOnly("src/nativeInterop/cinterop/libcurl-vc-x86-release-dll-ipv6-sspi-winssl/include")

                    // A shortcut for includeDirs.allHeaders.
                    //includeDirs("include/directory", "another/directory")
                }
            }
        }
        binaries {
            executable {
                // Change to specify fully qualified name of your application's entry point:
                entryPoint = 'sample.main'
                // Specify command-line arguments, if necessary:
                //runTask?.args('-Lsrc/nativeInterop/cinterop/libcurl-vc-x86-release-dll-ipv6-sspi-winssl/bin')
                runTask?.args('')
            }
        }
    }

我相信这个问题可能是链接器选项来定位dll,但是取消注释linkerOpts行没有帮助。

我想我已经放弃了Kotlin/本机,并且将坚持C来进行面向数据的本地编程.

编辑:,请注意,任何注释掉的文本都是我尝试过的 Ok,所以,这是我的def文件:

代码语言:javascript
复制
headers = curl/curl.h
headerFilter = curl/*

compilerOpts.linux = -I/usr/include -I/usr/include/x86_64-linux-gnu

linkerOpts.osx = -L/opt/local/lib -L/usr/local/opt/curl/lib -lcurl
linkerOpts.linux = -L/usr/lib/x86_64-linux-gnu -lcurl
linkerOpts.mingw = -Llibcurl-vc-x86-release-dll-ipv6-sspi-winssl/lib

好的,这是我的项目结构:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-27 19:59:35

我遵循了同样的步骤(jonyzzz博客)。我为Kotlin-原住民创建了一个Libcurl静态示例。对gzip和SSL的支持。编译为独立的exe,不需要dll

https://github.com/carlosrafp/Libcurl-Kotlin-Native-standalone

我使用mingw64 (gzip和libcurl)和msys2 2/mingw (openssl)在存储库上构建了静态库。

票数 1
EN

Stack Overflow用户

发布于 2020-09-04 19:53:48

当我寻找一个静态链接libcurl与我的二进制文件的解决方案时,我多次讨论了这个问题。

最后,我在Windows上使用WinInet进行HTTP通信。Linux和macOS二进制文件仍然依赖于带有libcurl的ktor客户机。

请参阅我关于如何将WinInet API与Kotlin:https://github.com/localazy/kotlin-mpp-wininet一起使用的示例。

对于一个简单的HTTP,HTTP已经足够好了,由此产生的二进制文件要小得多,在我的例子中,它没有附加的依赖项。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59112388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档