如何将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)
答案 0 :(得分:20)
许多数学函数(pow
,sqrt
,fabs
,log
等)都在math.h
和require the library libm
中声明要关联。与自动关联的libc
不同,libm
是一个单独的库,通常是requires explicit linkage。 The 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})
对于libm
是libc
一部分的目标,上述测试应该失败,即${EXTRA_LIBS}
将错过它,而target_link
将不会尝试添加。