.h 中定义的函数在 .cu 中声明

2023-12-09

我将一个项目分为三个文件夹:src、include、obj 我正在使用 CImg.h 和 cuda.h 库。 我声明void convolve(cimg_library::CImg<float>&, cimg_library::CImg<float> const &);在 convolve.h 中 并在 convolve.cu 中定义它

我的文件 :

主要.cpp:

#include "CImg.h"
#include "../include/convolve.h" 
using namespace cimg_library;

int main(){
CImg<float> var1("/*path*/");
CImg<float> var2("/*path2*/");
convolve(var1,var2);
//some code
}

卷积.h:

  1 #ifndef CONVOLVE_H
  2 #define CONVOLVE_H
  //some define
  10 void convolve(cimg_library::CImg<float>&, cimg_library::CImg<float> const &);
  11 #endif //CONVOLVE_H

卷积.cu:

1 void convolve(CImg<float>& img, const CImg<float>& kernel){
//some code
24     kernel<<<dimGrid,dimBlocks>>>(/*some arg*/);
}

和我的新 makefile :

1 CC=nvcc
2 CX=g++
3 IDIR =../include
4 special_IDIR = /usr/local/cuda-9.0/include
5 LDIR = /usr/local/cuda-9.0/lib64
6 CFLAGS=-I$(special_IDIR) -L$(LDIR)
7 
8 LIBS = -lX11 -lpthread -lcudart
9 ODIR = ../obj
10 
11 
12 _DEPS = convolve.h kernel.cuh
13 DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))
14 
15 _OBJ = main.o convolve.o kernel.o
16 OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))
17 
18 $(ODIR)/%.o: %.cpp $(DEPS)
19         $(CX) -x c++ -o $@ $< $(CFLAGS) $(LIBS)
20 
21 $(ODIR)/%.o: %.cu $(DEPS)
22         $(CC) -cu -o $@ $< $(CFLAGS)
23 
24 all: $(OBJ)
25         $(CC) -o $@ $^ $(CFLAGS) 
26 
27 
28 .PHONY: clean
29 
30 clean:
31         rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~ 

这是我的问题:它提到了void convolve(cimg_library::CImg<float>&, cimg_library::CImg<float> const &)未定义。

我想这是因为我从来没有明确的告诉编译器convolve的定义在convolve.cu中。但我不知道如何正确建立此链接。

感谢您的帮助 !


  1. 请不要发布带有行号的代码(或 Makefile 内容)。通常,它只是碍事。
  2. 这里的编译过程遵循编译...链接过程。第一个阶段是编译阶段,您应该使用-c对彼此而言g++ and nvcc在此阶段(即对于两种类型的 Makefile 目标)
  3. nvcc has no -cu选项。我想也许你的意思是-x cu

我还删除了函数调用中的&符号。

这是一个基于您所展示内容的简化示例,主要删除了CImg东西和其他一些不必要的物品:

$ cat main.cpp
#include "convolve.h"

int main(){

int var1 = 0;
int var2 = 1;
convolve(var1, var2);
}
$ cat convolve.h
void convolve(int &, int &);
$ cat convolve.cu
#include "convolve.h"

__global__ void kernel(){};

void convolve(int & i1, int & i2){

kernel<<<1,1>>>();
}
$ cat Makefile
CC=nvcc
CX=g++
IDIR = .
special_IDIR = /usr/local/cuda-9.1/include
LDIR = /usr/local/cuda-9.1/lib64
CFLAGS=-I$(special_IDIR) -L$(LDIR)
LIBS =
ODIR = .
_DEPS = convolve.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))
_OBJ = main.o convolve.o
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))
$(ODIR)/%.o: %.cu $(DEPS)
        $(CC) -c -x cu -o $@ $< $(CFLAGS)
$(ODIR)/%.o: %.cpp $(DEPS)
        $(CX) -c -x c++ -o $@ $< $(CFLAGS) $(LIBS)
all: $(OBJ)
        $(CC) -o $@ $^ $(CFLAGS)
.PHONY: clean
clean:
        rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~
$ make clean
rm -f ./*.o *~ core /*~
$ make
g++ -c -x c++ -o main.o main.cpp -I/usr/local/cuda-9.1/include -L/usr/local/cuda-9.1/lib64
nvcc -c -x cu -o convolve.o convolve.cu -I/usr/local/cuda-9.1/include -L/usr/local/cuda-9.1/lib64
nvcc -o all main.o convolve.o -I/usr/local/cuda-9.1/include -L/usr/local/cuda-9.1/lib64
$

改变的实例cuda-9.1 to cuda-9.0如果您的设置中有 CUDA 9.0,请在上面的 Makefile 中添加。链接器库(-L然而,编译命令实际上并不需要。链接时nvcc正如我们在这里所做的那样,也没有必要通过-I and -L引用作为工具包一部分的 CUDA 包含和 CUDA 库的开关。nvcc已经知道如何找到那些。

可能有许多额外的建议或对 Makefile 的调整,例如-x cu and -x c++开关可能是不必要的(至少对于我的简化示例来说是不必要的),但我的目标不是创建完美的 Makefile,而是为您提供一个路线图来解决您当前遇到的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.h 中定义的函数在 .cu 中声明 的相关文章

  • 如何在 OS X 上使用 OpenSSL 1.0.1 编译 PHP 5.5.19

    我已经安装了 OpenSSL 1 0 1j usr local ssl现在我尝试使用此版本的 OpenSSL 编译 PHP 5 5 19 这是我的配置过程 export CFLAGS arch x86 64 export CXXFLAGS
  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri

随机推荐

  • IOS:Swift:视频屏幕捕获

    iOS Swift 中的屏幕设备叫什么 当我打印我得到的设备时
  • 在 RESTful 应用程序中,我们如何区分“操作”和 HTTP 动词(GET、POST、PUT、DELETE)?

    在 RESTful 应用程序中 我们如何区分 操作 和 HTTP 动词 GET POST PUT DELETE 例如 据我了解 一个GET对资源的请求 products应该返回所有产品的列表 APOST请求 products应该创造一个新产
  • 在帐单地址中显示自定义字段

    我目前正在尝试将自定义字段添加到默认地址字段 名字 姓氏等 应该使用该字段来为客户设置称呼 为此 我使用了以下过滤器 add filter woocommerce default address fields custom woocomme
  • WPF MVVM 如何在视图更改后重新居中应用程序窗口?

    我正在使用本机 WPF 和 MVVM 开发一个非常简单的应用程序 主 shell 视图使用我认为常见的基本模式 其中包含一个与活动视图模型进行数据绑定的 ContentControl 该视图模型通过数据模板注入视图 这是它的缩写版本
  • 获取Azure订阅ID和部署槽(非常快)

    作为我的问题的后续部署状态 我想问一下有没有fast way找到 当前订阅 ID 角色所在的当前部署槽 暂存 生产 我目前正在使用管理 API 它有点慢 但我不想长时间缓存它 因为我无法确定缓存会在插槽交换时失效 在正在运行的实例中 您可以
  • 将 Ajax 响应下载为 zip 文件?

    我正在尝试将多个图像下载为 zip 文件 由于我使用的是 Azure blob 首先我列出了所有 blob 然后使用压缩它Archiver并使用管道函数将其发送到客户端 但我将 zip 作为原始文件获取 但未下载 我正在使用 Node js
  • VBA excel从工作表复制公式并粘贴到多个工作表

    VBA excel 从工作表复制公式并粘贴到工作表数组 例如 我想从工作表 Data C4 CX204 复制数据并粘贴到工作表 Test1 Test50 Test1 Test50 中的工作表将紧邻彼此 我想我可以将一个单元命名为 Test1
  • Excel VBA 循环遍历已过滤的数据透视项

    我是论坛新手 如果我的帖子不完整 请原谅我 我有一个非常简单的数据透视表 其中包含一个行字段 一个列字段 一个数据字段和一个过滤字段 行字段根据过滤器设置显示 使用 VBA 我的目的是循环遍历所有行枢轴项和列枢轴项并获取相应的字段名称和数据
  • 隐藏函数模板,声明专业化

    这是后续C 模板 防止基础模板的实例化 我使用模板来实现函数重载 而无需进行隐式类型转换的混乱 declare函数模板 定义所需的专业化 重载 一切都很好 除了错误的代码在链接阶段之前不会产生错误 lib hpp template
  • 为什么在 return 语句中使用移动构造函数是合法的?

    考虑以下 include
  • Jssor slider - 如何销毁并重新创建具有不同内容的 Jssor slider

    我正在尝试使用 Jssor 滑块根据所选类别及其子类别显示不同的 HTML 内容 我成功地为一个子类别创建了内容滑块 但我不知道如何销毁当前滑块并使用通过 Ajax 加载的不同内容重新创建它 子类别中的项目数量有所不同 因此据我了解 更改当
  • MySQL:使用计算约束创建表

    创建表时 是否可以根据两列的计算值声明约束 这是解释我想要做什么的伪代码 CREATE TABLE employee comments id int 11 user id int 11 franchise branch id int 11
  • Reactjs:路由器的渲染道具不起作用

    我的项目没有出现任何错误 它只是不渲染任何内容 我错过了什么吗 在 App js 中 我使用 render props 进行数据传输 import App css import BrowserRouter as Router Route R
  • 我可以“撤消”`git lfs checkout 吗?

    我运行了以下命令 git lfs migrate import everything include pdf git reflog expire expire unreachable now all git gc prune now git
  • 查找有向图中的所有循环

    如何找到 迭代 有向图中往返给定节点的所有循环 例如 我想要这样的东西 A gt B gt A A gt B gt C gt A 但不是 B gt C gt B 我在搜索中找到了此页面 由于循环与强连通分量不同 我继续搜索 最后 我找到了一
  • 使用 jQuery 添加带有 HTML5 数据属性的选择选项

    我正在尝试使用 jQuery 为选择元素构建一组选项 除了应该包含的数据属性之外 它正在工作 这似乎被省略了 这是我的代码 cJ is JSON object currency is my select element function m
  • 桌面图形 - 或“皮肤”窗口

    我正在寻找一种在桌面上绘制动画的方法 无窗框且背景透明 我在 Windows XP 中使用 Python 但它不一定是跨平台的 尽管这会是一个很好的好处 有谁知道可以做到这一点的Python库吗 如果您想要无框窗户 有多种选择 例如 pyg
  • Log4js javascript 创建每日日志文件

    我有一个nodejs项目 使用log4js来写日志 我想在开始新日期时创建新的文件日志 例子 每日 2017 07 31 log每日 2017 08 01 log每日 2017 08 02 log每日 2017 08 03 log 在jav
  • 运行 Multidexed Espresso .APK

    运行 Espresso 测试时 gradlew connectedDebugAndroidTest 我们遇到了这个问题 com android build api transform TransformException com andro
  • .h 中定义的函数在 .cu 中声明

    我将一个项目分为三个文件夹 src include obj 我正在使用 CImg h 和 cuda h 库 我声明void convolve cimg library CImg