链接静态库时编译CUDA代码

时间:2019-12-10 07:04:25

标签: c compilation cuda g++ nvcc

我有C代码main_code.chelper_code.c。前者取决于某些CUDA代码cuda_code.cu,而后者则取决于外部库mylib。为了使我的外部库mylib能够正常工作,我需要使用-static标志将其链接到我的代码:

g++ main_code.c helper_code.c -o main_code -static -L/usr/local/mylib/lib -lmylib -lmylib2

但是main_code.c也取决于CUDA代码cuda_code.cu。我可以将其链接为:

nvcc cuda_code.cu -c
g++ main_code.c -o main_code cuda_code.o -L/usr/local/cuda-10.0/lib64 -lcudart -lpthread

我想将我的代码与CUDA代码和外部库mylib一起编译。但是,链接mylib仅与-static标志一起使用。天真尝试如下,但它不起作用:

nvcc cuda_code.cu -c
g++ main_code.c helper_code.c -o main_code cuda_code.o -static -L/usr/local/mylib/lib -lmylib -lmylib2 -L/usr/local/cuda-10.0/lib64 -lcudart -lpthread

出现错误:

/usr/bin/ld: cannot find -lcudart
我假设的

是因为在与CUDA链接时无法使用静态标志(因为当我删除-static标志时(除了也删除了mylib库链接时,它会消失) )。

然后我尝试分别编译helper_code.c,然后将其链接到main_code.c,因为仅helper_code.c才需要mylib

helper.o:
    g++ helper_code.c -c -static -L/usr/local/mylib/lib -lmylib -lmylib2

cuda-code.o:
    nvcc cuda_code.cu -c

main-code: helper.o cuda-code.o
    g++ main_code.c -o main_code helper_code.o cuda_code.o -L/usr/local/cuda-10.0/lib64 -lcudart -lpthread

但这也不起作用。我收到一个undefined reference错误,该错误指的是mylib中定义的函数,这意味着到mylib的链接无效。我可以通过包含mylib库并使用-static标志来解决该错误,但这会中断CUDA链接。

我可以分别获得CUDA链接(到cuda_code.cu的工作或mylib链接的工作,但不能同时使两者同时工作。

那么,有一种解决方法可以链接mylib(需要-static),同时还要链接我的CUDA代码(不允许-static)?

1 个答案:

答案 0 :(得分:0)

在talonmies的评论中链接的答案之后,以下技巧得以实现:

g++ main_code.c -o main_code helper_code.o cuda_code.o -L/usr/local/mylib/lib -L/usr/local/cuda-10.0/lib64 -Wl,-Bstatic -lmylib -lmylib2 -Wl,-Bdynamic -lcudart