我试图为NPP icc函数创建静态包装器以从cGo(Golang)环境中调用它们时遇到问题。
我能够使用提供的静态NPP库创建和编译(C语言)可执行文件,并且效果很好。然后,将其编译为一个库(带有必要的标志)。但是,当我尝试从另一个可执行文件(普通C或cGo)链接该库时,出现错误消息“对nppiYCbCr420ToRGB_8u_P3C3R的未定义引用”。我在做什么错了?
wrapper.c
#include <nppi_color_conversion.h>
#include <cuda_runtime_api.h>
int YCbCr420ToRGB() {
NppiSize oSizeROI;
const Npp8u * const pSrc[3];
int cSrcStep[3];
Npp8u *cDst;
NppStatus ret = nppiYCbCr420ToRGB_8u_P3C3R(pSrc, cSrcStep, cDst, 0, oSizeROI);
return (int)ret; // ret = 14
}
build.sh
nvcc nppGo.c -lib -lnppicc_static -lnppc_static -lculibos -lcudart_static -lpthread -ldl -lrt -I /usr/local/cuda-10.0/include -L /usr/local/cuda-10.0/lib64 -o libnppGo
caller.c
#include <stdio.h>
#include "nppGo.h"
int main() {
int ret = YCbCr420ToRGB();
printf("Return code is: %d\n", ret);
return (int)ret;
}
buildtest.sh
nvcc caller.c -L. -lnppGo -o nppGo
最后我收到此错误消息
./libnppGo.a(tmpxft_0000204d_00000000-2_nppGo.o): In function `YCbCr420ToRGB':
nppGo.c:(.text+0xf9): undefined reference to `nppiYCbCr420ToRGB_8u_P3C3R'
collect2: error: ld returned 1 exit status
我还尝试使用另一个链接器/编译器,结果相同:
g++ -c nppGo.c -I /usr/local/cuda-10.0/include
ar rcs nppGo.a nppGo.o libnppicc_static.a libnppc_static.a libculibos.a libcudart_static.a libdl.a
答案 0 :(得分:0)
以下合并静态库的命令可能无法正常工作。
ar rcs nppGo.a nppGo.o libnppicc_static.a libnppc_static.a libculibos.a libcudart_static.a libdl.a
代替使用MRI脚本来合并这些静态库。像使用以下脚本创建nppGo.a一样,我们将其命名为LibnppGo.mri
在此之前,我们需要为nppGo.o
创建一个临时的静态库。
ar rcs nppGo_temp.a nppGo.o
LibnppGo.mri
如下所示:
create nppGo.a
addlib nppGo_temp.a
addlib libnppicc_static.a
addlib libnppc_static.a
addlib libculibos.a
addlib libcudart_static.a
addlib libdl.a
save
end
并以以下方式执行ar
:
ar -M <LibnppGo.mri
您应该获得正确的最终静态库,可以正确链接该库。