1

我正在尝试将 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 >&&)”,引用自:

cppfile.o 中的 std::basic_string, std::allocator > std::operator+, std::allocator >(char const*, std::basic_string, std::allocator >&&)
std::basic_string, std::allocator > std::operator+, std::allocator >(std::basic_string, std::allocator >&&, char const*) in cppfile.o
std::basic_string, std::allocator > std::operator+, std:: cppfile.o 中的分配器 >(std::basic_string, std::allocator >&&, std::basic_string, std::allocator >&&)
std::basic_string, std::allocator > std::operator+, std::allocator >(std::basic_string, std::allocator >&&, std::basic_string, std::allocator > const&) 在 cppfile.o
component::component(component&&) 在 cppfile.o "std::basic_string, std::分配器 >::operator=(std::basic_string, std::allocator >&&)",引用自:
函数在 cppfile.o 中的
component::operator=(component&&) 在 cppfile.o

ld:未找到架构 x86_64
collect2 的符号:错误:ld 返回 1 退出状态
make:* [程序] 错误 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 标准有关吗?

4

1 回答 1

1

一种解决方案似乎是-std=c++11从 C++ 代码的编译中删除。有了它,将链接 C++ 代码与字符串向量(或包含字符串的结构)相结合会导致上述错误。

我将在 GCC Bugzilla 中提交一个错误,同时使用我的解决方案作为解决方法。

于 2012-12-14T19:51:09.137 回答