如何使用CMake链接到C数学库?

时间:2016-01-06 04:25:38

标签: c cmake

如何将math库添加到我的CMake文件中?这post次引用添加了target link library,但我对C. Additional post不太熟悉 - 有人可以举例说明。 Documentation我正在使用C,并且我使用数学标题的pow方法接收undefined reference to 'pow'

cmake_minimum_required(VERSION 3.3)
project(CSCI-E-28-Unix-Linux-Systems-Programming)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES
    CMakeLists.txt
    getchar.c
    main.cpp
        hw0
    more01.c)

#target_link_libraries(<math.h> m)

add_executable(main main.cpp)
add_executable(getchar getchar.c)
add_executable(more01 more01.c)
add_executable(argu print_all_arguments.c)
add_executable(chars chars.c)
add_executable(ch4 ch4.c)

2 个答案:

答案 0 :(得分:20)

许多数学函数(powsqrtfabslog等)都在math.hrequire the library libm中声明要关联。与自动关联的libc不同,libm是一个单独的库,通常是requires explicit linkageThe linker presumes all libraries to begin with lib,以便链接到libm链接到m

您必须像target_link_libraries(ch4 m)一样使用它将libm链接到您的目标。第一个参数必须是目标。因此,它必须在add_executable(ch4 ch4.c)之后使用:

add_executable(ch4 ch4.c)
target_link_libraries(ch4 m)

答案 1 :(得分:0)

对于各种目标,最好测试是否需要添加库,以及是否需要添加库的命名方式。这是一种实现方法:

:
include(CheckLibraryExists)

CHECK_LIBRARY_EXISTS(m sin "" HAVE_LIB_M)                                                                                                
                                                                                                                                         
if (HAVE_LIB_M)                                                                                                                          
    set(EXTRA_LIBS ${EXTRA_LIBS} m)                                                                                                      
endif (HAVE_LIB_M)

:
//More tests & build-up of ${EXTRA_LIBS}
:

add_executable(ch4 ch4.c)
target_link_libraries(ch4 PUBLIC ${EXTRA_LIBS})

对于libmlibc一部分的目标,上述测试应该失败,即${EXTRA_LIBS}将错过它,而target_link将不会尝试添加。