2013-02-14 91 views
2

我想寫一個cmake列表爲我的Fortran項目與一個外部模塊,並且都必須與外部庫沒有任何cmake查找(findlib )包。到目前爲止,我的CMakeLists.txt看起來是這樣的:cmake for Fortran程序與模塊和外部庫

cmake_minimum_required (VERSION 2.6) 

project (Project 1) 

enable_language (C Fortran) 

set(extern_INCLUDE /home/path/lib/libdir/include/) 
set(extern_LIB /home/path/lib/libdir/lib) 
include_directories(${extern_INCLUDE}) 
link_directories (${extern_LIB}) 

add_library(mymodule STATIC mymodule.f90) 
set(main-source_SRC main-source.f) 
add_executable(main-source ${main-source_SRC}) 
#the name of the external library located in /home/path/lib/libdir/lib is libexternlib.so 
target_link_libraries(main-source mymodule externlib) 

一個libmymodule.a創建和絕對不是必要的(或共享一個爲此事)。我不想生成它們。我怎樣才能避免它的產生,並仍然編譯mymodule,生成.o和.mod以便能夠與主程序和外部庫鏈接?相當於ifort -c mymodule和ifort to all .o。

回答

0

您的源代碼爲mymodule。您可以在main-source_SRC中包含mymodule.f90。這應該夠了。我希望以下工作,但我無法測試它。

cmake_minimum_required (VERSION 2.6) 

project (Project 1) 

enable_language (C Fortran) 

set(extern_INCLUDE /home/path/lib/libdir/include/) 
set(extern_LIB /home/path/lib/libdir/lib) 
include_directories(${extern_INCLUDE}) 
link_directories (${extern_LIB}) 

set(main-source_SRC main-source.f mymodule.f90) 
add_executable(main-source ${main-source_SRC}) 
#the name of the external library located in /home/path/lib/libdir/lib is libexternlib.so 
target_link_libraries(main-source externlib) 
+0

謝謝,但它抱怨說它無法找到main-source/usr/bin/ld:找不到-lmymodule。 – Ivan 2013-02-14 21:14:07

+0

對不起,但我沒有進一步的想法。但是你嘗試設置(CMAKE_VERBOSE_MAKEFILE「開」)。這將打印執行進一步調試的命令。 – Holger 2013-02-14 21:30:20

+0

我認爲這會出錯,因爲Fortran模塊與包含文件不同。您應該可以通過將'include_directories'和外部模塊作爲'$ {extern_INCLUDE}/mymodule.f90'包含在可執行文件中來修復它。 – sigma 2013-02-17 22:56:59

0

文件libmymodule.a是一個靜態庫,並創建因爲add_library()函數靜態的選擇,告訴CMake的這樣做。嘗試使用SHARED來創建共享庫libmymodule.so - 儘管我不確定它是您在此擔心的靜態位。

如果外部庫沒有附帶FindLib文件,則可能很容易自己創建一個。 CMakeFiles包的FindLibs /目錄中有很多示例,它提供了示例CMake文件,特別是Fortran項目: http://cmakefiles.sf.net/

+0

我不想創建一個庫,我試圖生成一個.o和一個.mod來鏈接主程序。 FindLib不是Fortran案例中的答案。 – Ivan 2013-03-04 05:32:08

+0

靜態庫(.a文件)只是對象(.o)文件的集合。您可以像針對對象文件一樣鏈接它們。 – AstroFloyd 2016-07-15 15:46:28