Статическая оболочка для библиотеки Cuda NPP - PullRequest
0 голосов
/ 04 февраля 2019

Я столкнулся с проблемой при попытке создать статическую оболочку для некоторых функций icc NPP, чтобы вызвать их из среды cGo (Golang).

Я могу создать и скомпилировать исполняемый файл (язык C) с предоставленными статическими библиотеками NPP, и он хорошо работает.Затем я компилирую его как библиотеку (с необходимыми флагами).Но когда я пытаюсь связать эту библиотеку с другим исполняемым файлом (обычный 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

1 Ответ

0 голосов
/ 04 февраля 2019

следующая команда для объединения статических библиотек может работать некорректно.

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

И вы должны получить правильную окончательную статическую библиотеку, которую вы можете правильно связать.

...