目标文件中的重复符号:

Use*_*now -1 c++ r compilation linker-errors

我正在尝试编译两个.cpp文件,(foo.cpp和bar.cpp)并构建一个共享对象(project.so).但是编译失败并且(我的一部分)错误是:

....
duplicate symbol _n in:
foo.o
bar.o
ld: 5 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1(use -v to see 
invocation)
make: *** [project.so] Error 1
ERROR: compilation failed for package ‘project’
Run Code Online (Sandbox Code Playgroud)

我的.cpp文件有几个常见的和不常见的头文件,一些常见和不常见的命名函数,以及一组通常命名的变量:

Foo.cpp中

#include <iostream>
#include <fstream>
#include <vector>
#include <ctime>
#include <cmath>

size_t m1;
double k1=2.0;
std::vector<double> x,y;
std::vector<double> z;
size_t n,p;

void inputfoo(){...}
void output(){...}
Run Code Online (Sandbox Code Playgroud)

bar.cpp

#include <iostream>
#include <fstream>
#include <vector>
#include <ctime>
#include <cmath>
#include "Eigen/Dense"
#include "Eigen/Cholesky"

size_t m2;
double k2=2.0;
std::vector<double> x,y;
std::vector<double> z;
size_t n,p;

void inputbar(){...}
void output(){...}
Run Code Online (Sandbox Code Playgroud)

我的尝试:

如果我在每个.cpp文件中区分全局变量的名称,我可以获得较少数量的"重复符号"错误.也就是说,如果我在foo.cpp和bar.cpp中更改size_t mto ,我不会在错误中得到这一部分size_t m1size_t m2

duplicate symbol _m in:
    foo.o
    bar.o
Run Code Online (Sandbox Code Playgroud)

所以,现在我可以看到错误中的5个符号是针对x,y,z,n,p(在每个.cpp文件中全局定义的)

如果我将通常命名的函数的名称不同,也是如此.以前,我也会在错误中得到这一部分,

duplicate symbol __Z4inputP4init3RNGPi in:
    foo.o
    bar.o
Run Code Online (Sandbox Code Playgroud)

它将我引导到input(){...}函数.

所以,我将一个通常命名的函数(input(){..})的名称更改为inputfooinputbar,并且相应的错误消失了.

现在,我确信如果我在每个文件中使名称唯一,我将能够成功编译这两个.但是,我无法更改x,y,z,n,p,因为它们在这些文件中很多,我有更多的文件可以使用,它们具有共同的命名函数和变量.

任何人都可以向我解释这里发生了什么以及如何解决它?我真的很想知道造成这种情况的原因.我尝试阅读以前的帖子,' 了解链接器重复符号错误的来源 ',但我不认为这是一个与标题相关的问题.

非常感谢.

Dir*_*tel 5

该示例不完整,这使得评论很难.

但是让我猜一下:你在两个文件中都有全局变量,并且两者都可见.这是一个设计错误.你也可以

  • 使他们本地的每个文件,如果他们的状态是不能共享,使用static
  • 通过仅声明一个文件并extern在另一个文件中使用来共享它们.

但你引用的错误是不同的,我们对你的input::init()... 一无所知.

另外,我在这里也看不到任何与Rcpp有关的内容,那么为它添加标签呢?