我怎么能用cmake生成2个二进制文件,一个在fortran中,另一个在cxx中

时间:2017-06-19 15:24:02

标签: cmake fortran

我有一个必须链接到两个主要代码的库,一个在fortran中,另一个在cxx中。

我在src/lib/CMakeLists.txt中有这个库:

ADD_LIBRARY(mylib a.f90 b.c c.cc)

src/main/CMakeLists.txt,我有:

ADD_EXECUTABLE(mymain1 mymain1.f90)
TARGET_LINK_LIBRARIES(mymain1 mylib)

ADD_EXECUTABLE(mymain2 mymain2.cc)
TARGET_LINK_LIBRARIES(mymain2 mylib)

编译mymain1时,它使用CXX编译器链接而不是Fortran编译器。

如何告诉cmake使用Fortran链接mymain1和CXX链接mymain2

1 个答案:

答案 0 :(得分:2)

您可能会直接影响用于链接LINKER_LANGUAGE 属性的语言:

# Use Fortran compiler for link 'mymain1' executable
set_target_properties(mymain1 PROPERTIES LINKER_LANGUAGE Fortran) 

另一种方式可能是"教导" CMake正确选择链接器。

如果没有库,CMake会正确mymain1选择Fortran链接器,因为它仅从Fortran源编译,而mymain2的C ++链接器仅从C ++源编译。

但是与库的链接混淆CMake:因为库mylib是从几种语言的源代码编译而来的,所以CMake使用一些&#34;偏好分数来选择链接器#34;语言(参见CMAKE_<LANG>_LINKER_PREFERENCE变量)。更有可能的是,C ++&#34; beats&#34;在你的情况下Fortran。

此外,当选择mymain1的链接器语言时,CMake会考虑静态库mylib的语言。因为C ++甚至赢得了仅从Fortran源构建的可执行文件。

您可以使用变量CMAKE_<LANG>_LINKER_PREFERENCE_PROPAGATES禁用将库的语言传播到可执行文件:

# <place this *before* adding executables>
# Do not propagate language of C++ libraries to the executables.
set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES OFF)