Я хотел бы написать программу на C++, которая вызывает подпрограмму mvndst_() из
http://www.math.wsu.edu/faculty/genz/software/fort77/mvndstpack.f
В Linux, если я создам test.cc:
extern "C" {
int mvndst_(int *, double *, double *, int *, double *, int *,
double *, double *, double *, double *, int *);
};
int main() {
return 0;
}
и скомпилировать через
g++ -c -o test.o test.cc
gfortran -c -o mvndstpack.o mvndstpack.f
gfortran -Mnomain -o test test.o mvndstpack.o
тогда я получаю
mvndstpack.o: In function `main':
mvndstpack.f:(.text+0x4a2a): multiple definition of `main'
test.o:test.cc:(.text+0x0): first defined here
collect2: ld returned 1 exit status
Однако, если я запускаю strip -N main mvndstpack.o
до связывания, то связывание завершается успешно. Может кто-нибудь объяснить, почему здесь не работает флаг -Mnomain? Я также хотел бы избежать решения, использующего «strip», так как поведение «strip» в Mac OS X отличается (т. е. опция -N недоступна, и я не уверен в другом способе получить правильное поведение). Я также хотел бы избежать редактирования исходного кода Fortran, если это возможно.
Подробности: - GNU Fortran (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1 - g++ (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1 - GNU Strip (GNU Binutils для Ubuntu) 2.21.53.20110810 - Strip на Mac OS X 10.6 Снежный барс