【发布时间】:2017-07-28 03:58:17
【问题描述】:
我有一个使用一些库的主代码,我一直在编译它:
gcc importedCFile1.c importedCFile2.c mainCode.c -O3 -lm -Wall -o maincode -lrt
现在我在 mainCode 中添加了 CUDA 代码并将其扩展名更改为 .cu... 那么,我该如何编译整个代码呢?
我试过了:
nvcc importedCFile1.c importedCFile2.c mainCode.cu -o maincode
但我在导入的 C 文件中对我的函数有很多“未定义的引用”。
要包含我正在使用的 C 文件:
extern "C" {
#include "importedCFile1.h"
#include "importedCFile2.h"
}
而“importedCFile1.c”正在使用“importedCFile2.c”和“mainCode.cu”中声明的一些函数和变量。像这样:
extern int **se; // Variables from mainCode
extern int *n;
extern int numNodes;
extern int *getVector(int n); // Function from mainCode
extern int iRand(int high); // Function from importedCFile2
这个函数是未定义引用的原因。我该怎么办?
另外,如何添加 C 代码所需的标志,例如 -lrt、O3、lm 和 Wall??
编辑:您可以在此处找到问题的简化示例:
https://github.com/mvnarvaezt/cuda/tree/master/minimalExample
如果你用 gcc 编译 mainCode.c 和importedCFile.c 它工作正常。如果您使用 nvcc 编译 mainCode.cu 和 importsCFile.c,您将获得对 anExample()(importedCFile.c 中的函数)的未定义引用。
然后您评论导入importedCFile.c 的标头以及它可以找到的对anExampled() 函数的调用。
【问题讨论】:
-
将头文件包含在
extern "C" {#include ... }中。否则函数名将根据 C++ 规则被破坏。 -
@tera 我做了,但是“importedCFile1.c”也使用了“importedCFile2.c”和“mainCode.cu”中的一些函数和变量,我得到了“未定义的引用”。我在“importedCFile1.c”中有类似的东西:extern int *getVector(int n); // 这是mainCode.cu中的一个函数 extern int iRand(int high); // 这是importedCFile2.c中的一个函数
-
应该可以正常工作。向我们展示一些代码来演示问题。
-
您可以通过在前面加上
-Xcompiler将任何选项传递给C 编译器(如-Wall),并在前面加上-Xlinker将任何选项传递给链接器。-l和-Oare 也被 nvcc 直接理解,其中-O3even 是默认值。所以你的命令行应该变成nvcc -lrt -lm -Xcompiler -Wall importedCFile1.c importedCFile2.c mainCode.cu -o maincode。 -
您的示例(感谢您的展示)应该仍然可以正常工作。请发帖Minimal, Complete, and Verifiable example。