我正在使用一个库(stb_image),该库包含我从互联网上下载的2个头文件。
我正在使用nvcc进行编译(我敢肯定,使用g ++会遇到相同的错误),并且由于其速度极慢,我将每个.cu文件编译为一个.o文件,然后将它们链接在一起。
我的Makefile摘录:
./bin/filter: $(object_files) $(h_files)
nvcc $(object_files) -o ./bin/filter
./bin/%.o : %.cu
nvcc -dc $< -o $@
./bin/%.o : %.cpp
nvcc -dc $< -o $@
我有两个包含image.h
的.cu文件。 image.h
包括两个库文件,并在名称空间中定义了一些其他方法。
main.cu:
#include "filter.h"
#include "image.h"
#include "apply.h"
...
apply.cu:
#include "filter.h"
#include "image.h"
#include "apply.h"
...
image.h:
#ifndef IMAGE_H
#define IMAGE_H
#include <vector>
#include <iostream>
extern "C" {
#define STB_IMAGE_IMPLEMENTATION
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb_image.h"
#include "stb_image_write.h"
}
using namespace std;
struct Pixel {
...
};
struct Image {
...
};
namespace ImageIO {
Image loadImage(char* filename) {
...
}
void writeImage(char* filename, Image &image) {
...
}
};
#endif
make ./bin/filter
的输出是:
nvcc -dc main.cu -o bin/main.o
nvcc -dc apply.cu -o bin/apply.o
nvcc ./bin/main.o ./bin/apply.o -o ./bin/filter
./bin/apply.o: In function `stbi_failure_reason':
tmpxft_00008553_00000000-5_apply.cudafe1.cpp:(.text+0x201): multiple definition of `stbi_failure_reason'
./bin/main.o:tmpxft_00008532_00000000-5_main.cudafe1.cpp:(.text+0x201): first defined here
...
[对于库头中定义的每个单个函数以及ImageIO::writeImage
和ImageIO::loadImage
,都会给出多个定义错误。
我认为正在发生的是,头文件中的定义同时包含在bin/main.o
和bin/apply.o
中,因此将它们链接在一起时,每个包含的函数都有2个定义。
如果不需要重新格式化库头以使用其自己的.cpp文件,我会更愿意,因为这将需要大量工作。是否可以在不将功能定义移出头文件的情况下解决此问题?
我想出了一种解决方法。由于我只需要image.h函数中的库文件,所以我制作了image.cpp并将库文件专门导入image.cpp中。这样,它们仅包含在image.o中,而没有包含在其他.o文件中。