首页 > 解决方案 > C++中同一函数的多个定义

问题描述

我正在为神经网络编写一个库。我需要一些必要的功能,所以我将它们分隔在一个单独的头文件中。我还提供了定义守卫。我还将头文件仅包含在一个文件中,但链接器还声称程序中的所有函数都有多个定义。库结构如下:

namespace maya:
     class neuron [neuron.hpp, neuron.cpp]
     class ffnet [ffnet.hpp, ffnet.cpp]
     struct connection [connection.hpp]
     functions [functions.hpp]

函数头文件是这样写的:

#ifndef FUNCTIONS_HPP
#define FUNCTIONS_HPP
// some functions here
double random_double(){//some code}
#endif

这个functions.hpp文件只包含在neuron.hpp中,因为ffnet依赖于神经元,所以我只在ffnet中包含了neuron.hpp一次。此 ffnet.hpp 仅包含在 main.cpp 中一次。main.cpp 是我用来测试我的库的文件。

这个链接器会抛出类似这样的错误:
/usr/bin/ld: /tmp/ccN7ywby.o: in function `maya::random_double()': neuron.cpp:(.text+0x0): multiple definition of maya::random_double()'; /tmp/ccvDr1aG.o:main.cpp:(.text+0x0): first defined here

/usr/bin/ld: /tmp/cc66mBIr.o: in function `maya::random_double()':`` ffnet.cpp:(.text+0x0): multiple definition of `maya::random_double()'; /tmp/ccvDr1aG.o:main.cpp:(.text+0x0): first defined here

我还使用以下方法编译了我的程序:
g++ main.cpp neuron.cpp ffnet.cpp -o net

我认为这不是必需的,但以防万一:
$ uname -a
Linux brightprogrammer 4.19.0-kali3-amd64 #1 SMP Debian 4.19.20-1kali1 (2019-02-14) x86_64 GNU/Linux

标签: c++linuxldone-definition-rulemultiple-definition-error

解决方案


您必须在 .cpp 文件中编写代码,random_double()而不是 .hpp 或 .h 文件。或者,如果您将代码保存在 .hpp 文件中,请在inline之前添加。double random_double() { //some code }


推荐阅读