[NVCC链接目标文件时的多个定义

问题描述 投票:0回答:1

我正在使用一个库(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::writeImageImageIO::loadImage,都会给出多个定义错误。

我认为正在发生的是,头文件中的定义同时包含在bin/main.obin/apply.o中,因此将它们链接在一起时,每个包含的函数都有2个定义。

如果不需要重新格式化库头以使用其自己的.cpp文件,我会更愿意,因为这将需要大量工作。是否可以在不将功能定义移出头文件的情况下解决此问题?

c++ include g++ linker-errors nvcc
1个回答
0
投票

我想出了一种解决方法。由于我只需要image.h函数中的库文件,所以我制作了image.cpp并将库文件专门导入image.cpp中。这样,它们仅包含在image.o中,而没有包含在其他.o文件中。

© www.soinside.com 2019 - 2024. All rights reserved.