2013-02-14 89 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