我有一个必须链接到两个主要代码的库,一个在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
?
答案 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)