2017-06-19 20 views
0

私はFortranとcxxの2つのメインコードにリンクする必要があるライブラリを持っています。私はどのように2つのバイナリを生成できますか?1つはfortranで、もう1つはcxxで、もう1つはcmakeです

私はsrc/lib/CMakeLists.txtでこのライブラリを持っている:

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

src/main/CMakeLists.txtで、私が持っている:mymain1をコンパイルする場合

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

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

、それは、Fortranの代わりにリンクするCXXコンパイラを使用しています。

cmakeにFortranを使用してmymain1とCXXをリンクしてmymain2をリンクするにはどうすればよいですか?

答えて

2

あなたは直接LINKER_LANGUAGEプロパティとのリンクに使用される言語に影響を与える可能性があります適切なリンカーを選択することCMakeのを「教える」ことができ

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

別の方法を。ライブラリなし

はcmakeのは、正しくそれはFortranのソースからのコンパイルのみとしてmymain1のためのFortranリンカを選択して、それはC++のソースからのコンパイルのみとmymain2のためのC++リンカでしょう。

しかし、ライブラリとのリンクはCMakeのを台無し:ライブラリmylibいくつかの言語でソースからコンパイルされているため、CMakeのは、それが言語のためのいくつかの「好みのスコアを」使用するためのリンカーを選択する(CMAKE_<LANG>_LINKER_PREFERENCE変数を参照してください)。おそらく、C++はあなたのケースでFortranを打ち負かすでしょう。

さらに、mymain1のリンカ言語を選択すると、CMakeは静的ライブラリの言語mylibを考慮に入れます。そのため、C++はFortranソースのみから構築された実行ファイルでも勝ちます。

# <place this *before* adding executables> 
# Do not propagate language of C++ libraries to the executables. 
set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES OFF) 
:あなたが使用して変数 CMAKE_<LANG>_LINKER_PREFERENCE_PROPAGATES実行ファイルにライブラリの言語を伝播無効にすることが

関連する問題