在CMake中添加静态依赖

时间:2017-06-09 12:05:52

标签: cmake

我有一个示例项目:

.
├── CMakeLists.txt
└── src
    └── test1.f90

其中test1.f90使用特定版本的Lapack(因此我不能使用FindLAPACK)。

我正在尝试使用CMake编译它:

cmake_minimum_required(VERSION 2.5)
project(TEST)

file(GLOB_RECURSE sources  src/*.f90)

add_executable(cmake.x ${sources})

enable_language(Fortran)
set(CMAKE_Fortran_COMPILER_ID "IBM")


if(CMAKE_Fortran_COMPILER_ID MATCHES "IBM")
    set(CMAKE_SHARED_LIBRARY_LINK_Fortran_FLAGS)
    MESSAGE(STATUS "IBM")
    SET(CMAKE_EXE_LINKER_FLAGS "-Wl,-allow-multiple-definition ")
    set(CMAKE_Fortran_COMPILER mpixlf2008_r)
    set(debug "-C")
endif()


set(CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG} ${bounds}")
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${dialect}")

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
MESSAGE( STATUS "cmake_module_path:    " ${CMAKE_MODULE_PATH})

如果我运行make VERBOSE=1,则会产生:

...
[100%] Building Fortran object CMakeFiles/cmake.x.dir/src/test1.o
mpixlf2008_r    -c /work/jias12/jias1217/lapack_test/src/test1.f90 -o CMakeFiles/cmake.x.dir/src/test1.o
** main   === End of Compilation 1 ===
1501-510  Compilation successful for file test1.f90.
Linking Fortran executable cmake.x
/usr/bin/cmake -E cmake_link_script CMakeFiles/cmake.x.dir/link.txt --verbose=1
mpixlf2008_r   -Wl,-allow-multiple-definition    CMakeFiles/cmake.x.dir/src/test1.o  -o cmake.x  
CMakeFiles/cmake.x.dir/src/test1.o:(.text+0x5c): undefined reference to `sgesv'
make[2]: *** [cmake.x] Error 1
make[2]: Leaving directory `/work/jias12/jias1217/lapack_test'
make[1]: *** [CMakeFiles/cmake.x.dir/all] Error 2
make[1]: Leaving directory `/work/jias12/jias1217/lapack_test'
make: *** [all] Error 2

这显然不起作用,因为我没有包含LAPACK,我可以手动完成:

mpixlf2008_r   -Wl,-allow-multiple-definition    CMakeFiles/cmake.x.dir/src/test1.o  -o cmake.x -L$LAPACK_LIB -L/bgsys/local/lib -llapack -lesslbg

哪个工作正常。如何使用CMake实现这一目标?我想在* .o文件之后将-L$LAPACK_LIB -L/bgsys/local/lib -llapack -lesslbg添加到链接器。我所管理的就是在* .o文件之前将它们添加为标志,这会失败。我在网上看了很多例子,但是我找不到适用于我的案例。这是test1.f90

这是在文件夹中:

 > ls $LAPACK_LIB
libblas_extra.a  libcblas.a  liblapack.a  liblapacke.a  libtmglib.a
ls /bgsys/local/lib/
BGeic.pm  BG.pm  libesslbg.a  libesslsmpbg.a

1 个答案:

答案 0 :(得分:0)

正如Tsyvarev正确提到的那样:

  

target_link_libraries与...链接有什么问题?   指定的库(标志-l的含义)和link_directories   库搜索路径(标志-L的含义)?

那些需要以正确的顺序进行调用,这导致:

cmake_minimum_required(VERSION 2.5)
project(TEST)

file(GLOB_RECURSE sources  src/*.f90)

link_directories($ENV{LAPACK_LIB} /bgsys/local/lib)
enable_language(Fortran)

add_executable(cmake.x ${sources})
target_link_libraries(cmake.x lapack esslbg)