2017-06-19 58 views
0

我有一个库,必须链接到2个主要代码,一个在fortran和cxx中。我如何生成2个二进制文件,一个在Fortran中,另一个在cxx中,cmake

我在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

回答

2

您可以直接用于与LINKER_LANGUAGE财产链接语言影响:

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

另一种方式可能是“教” CMake的正确选择连接。

没有图书馆的CMake会正确选择的Fortran链接器为mymain1,因为它从Fortran的来源,只汇编和C++链接器为mymain2,因为它从C++源代码编译只。

但随着库链接打乱CMake的:因为库mylib从来源上编译几个语言,CMake的它使用语言中的某些“分数优先”(见CMAKE_<LANG>_LINKER_PREFERENCE变量)选择连接。更有可能的是,C++在你的情况下“击败”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) 
相关问题