Я пытаюсь связать файл 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> std :: operator +, std :: allocator> (символ const *, std :: basic_string, std :: allocator>&&) в cppfile.o
std :: basic_string, std :: allocator> std :: operator +, std :: allocator> (std :: basic_string, std :: allocator>&&, char const *) в cppfile.o
std :: basic_string, std :: allocator> std :: operator +, std :: allocator> (std :: basic_string, std :: allocator>&&, std :: basic_string, std :: allocator>&&) в cppfile.o
std :: basic_string, std :: allocator> std :: operator +, std :: allocator> (std :: basic_string, std :: allocator>&&, std :: basic_string, std :: allocator> const&) в cppfile.o
Компонент :: компонент (компонент&&) в cppfile.o «std :: basic_string, std :: allocator> :: operator = (std :: basic_string, std :: allocator>&&) «, на которые ссылаются:
функция в cppfile.o
Компонент :: Оператор = (компонент&&) в cppfile.old: символы не найдены для архитектуры x86_64
collect2: error: ld вернул 1 состояние выхода
делать: * [программа] Ошибка 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, связанного с библиотекой строк?
Одним из решений, как представляется, является удаление -std=c++11
из компиляции кода C ++. При этом объединение кода C ++ с вектором строк (или структур, содержащих строку) вызывает вышеуказанные ошибки.
Я собираюсь сообщить об ошибке в GCC Bugzilla и использовать свое решение в качестве временного решения.
Других решений пока нет …