2014-02-07 5 views
5

Ich entwickle ein Fortran-Programm prog1 und zwei Fortran-Bibliotheken, lib1 und lib2. prog1 hängt von lib1 und lib2 ab, und lib1 hängt auch von lib2 ab. Die Verzeichnisstruktur könnte wie folgt aussehen:Verknüpfung von statischen Fortran-Bibliotheken mit Abhängigkeiten

prog1 
|- lib2 
|- lib1 
    |- lib2 

In einigen Fällen würde ich prog1 gerne eine andere Version von lib2 als das, was lib1 Anwendungen zu verwenden. Wenn jedoch die statische Bibliothek lib1.a die Objektdateien von lib2 enthält, der Linker mir Fehler wie

./lib1/lib1.a(lib2_module.o): In function `__lib2_module_MOD_function1': 
./lib2/src/lib2_module.f90:12: multiple definition of `__lib2_module_MOD_function1' 
./lib2/lib2.a(lib2_module.o):./lib2/src/lib2_module.f90:12: first defined here 

Mit anderen Worten gibt, wird der Linker verwechselt, da beide Bibliotheken die gleiche Objektdatei lib2_module.o, aber mit unterschiedlichen Versionen enthalten.

Also meine Frage ist: Wie können zwei Fortran-Bibliotheken verschiedene Versionen der gleichen Objektdateien enthalten (und verwenden)?

+0

keine Antwort, aber warum sollte 'prog1' von einer anderen' lib1' Version abhängig sein? Wenn Sie das umgehen können, ist Ihr Problem möglicherweise nicht vorhanden. – steabert

+0

In einigen Fällen möchte ich "lib1" die neue Version von 'lib2' verwenden lassen, aber' prog1' die alte Version verwenden lassen, um sie zu ändern (oder zu verschieben). Aber die Verwendung derselben Version wäre natürlich die einfachste Lösung. – halvorlu

Antwort

2

Ich glaube nicht, dass es möglich ist, es durch Verwendung von statischen Bibliotheken zu tun. Dies liegt daran, dass aus prog1 die Funktion 1 aus dem Modul von lib2 einfach zweimal definiert ist. On Wikipedia you can see that

... externe Funktionen und Variablen, die bei Compile-Zeit in einem Anrufer aufgelöst werden und in eine Zielanwendung kopiert ...

Und Sie würden wahrscheinlich nicht überrascht sein, dass dieser Code erzeugen würde ähnliche Fehler, die Sie in Ihrer Frage sehen:

prog1.f90

some code here... 

function funtion1(x) ... 
    ...first version of function1 ... 
end function 

function funtion1(x) ... 
    ...second version of function1 ... 
end function 

some code here... 

Eine Möglichkeit wäre, mindestens lib1 als shared library zu kompilieren und (compiler/plattformabhängig) sicherzustellen, dass die Symbole aus lib2 nicht aus shared lib1 exportiert werden.

+0

Danke für Ihre Antwort. Aber wäre es nicht möglich, 'lib2's Funktionen in' lib1.a' beispielsweise mit einem Präfix zu versehen, das sie von denen trennt, die 'prog1' direkt von' lib2' verwendet? – halvorlu

+0

@halvorlu Ich kenne keine Möglichkeit – Peter