从模块 CCurl 调用 curlHelperSetOptString 时出错 - swift -Kitura

Error when Call curlHelperSetOptString from module CCurl - swift -Kitura

我使用 CCurl (https://github.com/IBM-Swift/CCurl.git) in my project (Kitura https://github.com/IBM-Swift/Kitura) 然后我调用 func curlHelperSetOptString ,编译 "swift build" 并得到一个错误:

duplicate symbol _curlHelperSetOptString in: /Users/xxxx/Documents/server/ServerSwift/.build/debug/ServerSwift.build/UploadService.swift.o /Users/xxxx/Documents/server/ServerSwift/.build/debug/KituraNet.build/ClientRequest.swift.o ld: 1 duplicate symbol for architecture x86_64 :0: error: link command failed with exit code 1 (use -v to see invocation) :0: error: build had 1 command failures

代码:

import CCurl
var handle=curl_easy_init()
if (handle != nil) {
        let url = "http: //example.com/"
        let buffer=url.cString(using: .utf8)
        curlHelperSetOptString(handle, CURLOPT_URL, buffer)
}

请帮帮我

检查您在 Build Phases/Compile Sources 下没有多个条目。如果是,请删除它们。

您也可以尝试清理您的项目,甚至 运行 swift package generate-xcodeproj 再次尝试。

这是因为您正在导入 ccurl,它已经导入到 kitura-net 包中。

CCurl 已经包含在 Kitura-Net/Package.swift 中时,您可能直接将其包含在 Package.swift 中。

对于大多数 Swift 模块,这不是问题,但是 CCurl 必须有一个 hack 因为 libCurl 主要包含 variadic functions and Swift doesn't import variadic functions from C librarieshack 在 C 头文件中创建静态函数以创建 libCurl 函数的非可变版本。正是这些静态函数在这里被复制(每个模块都是单独编译的,所以你不能 #ifndef 绕过它们,因为它们彼此看不到)。

尝试从您的 Package.swift 文件中删除 CCurl 依赖项,并仅依赖于它为您包含的事实,希望您会没事。

实际上可能是因为我们将 CCurl 辅助函数定义为外部内联,而不是静态内联。显然 extern inline 导致对已定义函数的引用之一成为外部名称,如果它被多次导入会导致问题。

我们会调查的。

IBM-Swift/CCurl.git 0.2.2 已被标记。它包含对此处提到的问题的修复。