我正在尝试将C ++文件与我的Fortran 90程序链接,但在使用gfortran时遇到链接错误。
我的Fortran文件编译为:
gfortran -c -o obj/file.o file.f90 -O0 -g3 -ffree-line-length-none -fcheck-array-temporaries -fbounds-check
和我的C ++文件是使用g++-4.7 -c -o obj/cppfile.o cppfile.cpp -O0 -g3 -std=c++11
然后,所有人都与gfortran联系在一起:
gfortran -o program obj/file.o obj/cppfile.o -O0 -g3 -ffree-line-length-none -fcheck-array-temporaries -fbounds-check -lm -llapack -lc -lgfortran -lgcc -lstdc++
执行此操作时,我收到以下链接错误:
架构x86_64的未定义符号:
“std :: basic_string,std :: allocator :: basic_string(std :: basic_string,std :: allocator>&&)”,引自:std :: basic_string,std :: allocator> cppfile.o中的std :: operator +,std :: allocator>(char const *,std :: basic_string,std :: allocator>&&)
std :: basic_string,std :: allocator> cppfile.o中的std :: operator +,std :: allocator>(std :: basic_string,std :: allocator>&&,char const *)
std :: basic_string,std :: allocator> cppfile.o中的std :: operator +,std :: allocator>(std :: basic_string,std :: allocator>&&,std :: basic_string,std :: allocator>&&) /> std :: basic_string,std :: allocator> cppfile.o中的std :: operator +,std :: allocator>(std :: basic_string,std :: allocator>&&,std :: basic_string,std :: allocator> const&)
cppfile.o中的component :: component(component&&)“std :: basic_string,std :: allocator> :: operator =(std :: basic_string,std :: allocator>&&)”,引用来自:
cppfile.o中的 function cppfile.o中的component :: operator =(component&&)ld:找不到架构x86_64的符号
collect2:错误:ld返回1退出状态
make: * [program] Error 1
我的c ++文件如下所示:
#include <iostream>
#include <string>
#include <fstream>
#include <iomanip>
#include <math.h>
#include <stdio.h>
#include <vector>
using namespace std;
struct component
{
string num; // numerator of component
string den; // denominator of component
int ind; // index of variable
};
extern "C"{
void subroutine_ (int num, const int* array)
{
...
return;
}
有关为何会发生这种情况的任何想法?我确保链接-lstdc ++库。它可能与我使用与字符串库相关的C ++ 11标准有关吗?
答案 0 :(得分:1)
一个解决方案似乎是从C ++代码的编译中删除-std=c++11
。有了它,将C ++代码与字符串向量(或包含字符串的结构)相结合会导致上述错误。
我将在GCC Bugzilla中提交一个错误,并在此期间使用我的解决方案作为解决方法。