2012-04-10 5 views
1

В случае разработки статической библиотеки с использованием fortran:static lib со многими модулями

lib состоит из нескольких модулей, например. «модуль a», «модуль b» и т. д.

Каждый из модулей имеет общедоступные переменные, типы и процедуры.

Теперь вы хотите использовать lib в программе «test».

Одним из возможных способов является использование каждого из модулей и предоставление файла * .a lib во время связывания. например,

program test 
    use a 
    use b 
    ... 
end program 

Но было бы лучше, если бы был использован только один модуль/*. h. например .:

program test 
    use all 
    ... 
end program 

Одно из возможных решений, чтобы скопировать все публичные переменные, типы и интерфейс процедур в «модуле всех», а также использовать модуль «все», а не отдельных модулей.

Но если какой-либо из отдельных модулей был изменен, «модуль все» также необходимо изменить для соответствия изменениям.

Есть ли более подходящий метод для работы или имеется автоматический инструмент для создания «модуля все»?

Большое спасибо за любой ввод.

ответ

3

Я бы не стал копировать код из отдельных модулей в модуль «все», потому что, как вы говорите, это приводит к дополнительной работе при изменении кода. И возможность ошибки. Вместо этого «используйте» эти модули в модуле «все». Затем, когда вы хотите, чтобы все они «использовали весь модуль». Когда вы хотите использовать какой-то конкретный модуль, вы используете его. То, что вы должны защищать, потому что это запрещено, это ссылки на циркулярные модули: A использует B, использует C, использование A не разрешено.

+0

Да, это было бы лучше. Мне потребовалось довольно много времени, чтобы понять, что импортированные символы модуля экспортируются снова, если я не использую 'private', который я сейчас использую как можно больше. –

+0

Благодарим вас за ответ. Таким образом, все отдельные модули должны быть включены в папку include. И все используемые отдельные модули необходимо скомпилировать с помощью программы вождения, что делает * .a почти бесполезным. Это правильно? – mianzhi

2

Похоже, что конечным решением является использование submodule, который, к сожалению, не поддерживается gcc.

См: http://fortranwiki.org/fortran/show/Submodules

+1

+1, но почти никто его еще не поддерживает, afaik –

Смежные вопросы