如何解决在链接库中找不到符号
我正在尝试创建 go 应用程序,它使用共享库中 sdk 中的一些 C++ 代码。
添加了对带有 #cgo LDFLAGS
的目标库的引用:
#cgo LDFLAGS: -L/opt/cprocsp/lib/amd64 -lxades -v
并使用
构建 go 应用程序go build -o main .
编译正常,但链接失败并报错
/usr/bin/ld: $WORK/b001/_x003.o: undefined reference to symbol 'CryptReleaseContext'
/usr/bin/ld: //opt/cprocsp/lib/amd64/libcapi10.so.4: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
函数 CryptReleaseContext 存在于 /opt/cprocsp/lib/amd64/libxades.so
中。
使用 -v
选项,我注意到链接器参数顺序
/usr/lib/gcc/x86_64-linux-gnu/8/collect2 ... $WORK/b001/_cgo_main.o $WORK/b001/_x001.o $WORK/b001/_x002.o $WORK/b001/_x003.o -lxades -lstdc++ ...
在 Google 中,我发现参数顺序可能很重要,但我找不到控制它们并坚持下去的方法。如何构建应用?
示例:main.go
package main
import "log"
func main() {
data := "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<Envelope xmlns=\"urn:envelope\">" +
"<Data>Hello,World!</Data>" +
"<Node xml:id=\"nodeID\">Hello,Node!</Node>" +
"</Envelope>"
signed := Sign(data)
log.Print(signed)
}
signer.go
package main
/*
#cgo LDFLAGS: -L/opt/cprocsp/lib/amd64 -lxades -v
#include <stdarg.h>
#include <stdlib.h>
#include "signer.h"
*/
import "C"
import "log"
import "unsafe"
func Sign(data string) (result string) {
log.Print("Signing message")
c_data := C.CString(data)
defer C.free(unsafe.Pointer(c_data))
c_result := C.CString(result)
defer C.free(unsafe.Pointer(c_result))
C.sign(c_data,c_result)
return C.GoString(c_result)
}
signer.h
void sign(char* src,char *dst);
signer.cpp
SDK 的示例代码,使用来自 /opt/cprocsp/lib/amd64/libxades.so
...
extern "C" {
void sign(char* src,char *dst){
BYTE *pbToBeSigned = (BYTE *) src;
DWORD cbToBeSigned = strlen(src);
static XADES_SIGN_MESSAGE_Para signParams = { sizeof(signParams) };
initSignParams(&signParams);
PCRYPT_DATA_BLOB pSignedMessage = 0;
// Создаем подписанное сообщение
if (!XadesSign(&signParams,NULL,FALSE,pbToBeSigned,cbToBeSigned,&pSignedMessage)) {
cout << "XadesSign() Failed" << endl;
return;
}
vector<unsigned char> message(pSignedMessage->cbData);
copy(pSignedMessage->pbData,pSignedMessage->pbData + pSignedMessage->cbData,message.begin());
char* result = reinterpret_cast<char*>(message.data());
strcpy(dst,result);
}
}
更新
#cgo LDFLAGS: -L/opt/cprocsp/lib/amd64 -Wl,-rpath,/opt/cprocsp/lib/amd64 -lxades -v
没有帮助
解决方法
答案是第二个错误:
def clean_task(self):
task = self.cleaned_data.get("task")
if len(task) > 255:
raise ValidationError("Error: maximum length limit is 255 characters (it has %s.") % len(task)
return task
第一次尝试添加 #cgo LDFLAGS: -L/opt/cprocsp/lib/amd64 -lxades -lcapi10 -lcapi20 -v
- 错过了关于 lcapi10
而不是 10 的新错误
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。