Моя цель: library2.so
использует library1.so
, а mycode.o
использует (библиотеки должны быть связаны) library2.so
(и, возможно, library1.so
).
Исходный код (файлы заголовков одной строки опущены):
библиотека1.cu:
__device__ void func1_lib1(void){}
библиотека2.cu:
#include "library1.h"
__global__ void func1_lib2(void)
{
func1_lib1();
}
extern "C"
void func2_lib2(void)
{
func1_lib2<<<1,1>>>();
}
мой код.с:
#include "library2.h"
int main(void)
{
func2_lib2();
}
Я создаю общие библиотеки в соответствии с с помощью Makefile
broken:
rm -f *.o *.so
nvcc -arch=sm_30 --compiler-options '-fPIC' -dc library1.cu
nvcc -arch=sm_30 --compiler-options '-fPIC' -dlink -o cuda-lib1.o library1.o
gcc -shared -Wl,-soname,library1.so -o library1.so library1.o uda-lib1.o
nvcc -arch=sm_30 --compiler-options '-fPIC' -dc library2.cu
nvcc -arch=sm_30 --compiler-options '-fPIC' -dlink -o cuda-lib2.o library2.o -lrary1
gcc -shared -Wl,-soname,library2.so -o library2.so library2.o cuda-lib2.o
gcc -c mycode.c
gcc -o mycode -L. -lrary2 -lrary1 mycode.o
working:
rm -f *.o *.so
nvcc -arch=sm_30 --compiler-options '-fPIC' -dc library1.cu
nvcc -arch=sm_30 --compiler-options '-fPIC' -dc library2.cu
nvcc -arch=sm_30 --compiler-options '-fPIC' -dlink -o cuda-lib.o library1.o library2.o
gcc -shared -Wl,-soname,library.so -o library.so library1.o library2.o cuda-lib.o
gcc -c -fPIC mycode.c
gcc -o mycode -L. -lrary -L/usr/local/cuda/lib64 -lcuda -lcudart mycode.o
make working
работает без проблем. Но это не цепочка библиотек. library1.cu
и library2.cu
находятся в одном файле .so
.
make broken
терпит неудачу с
nvcc -arch=sm_30 --compiler-options '-fPIC' -dlink -o cuda-lib2.o library2.o -lrary1
nvlink error : Undefined reference to '_Z10func1_lib1v' in 'library2.o'
Если я осматриваю library1.so
с помощью nm
, внутри цели (T) _Z10func1_lib1v
.
make working
делает только одну библиотеку, а не цепочку библиотек. Вопрос в заголовке: Как сделать цепочку библиотек. - person Luuuucky   schedule 09.03.2016