programing

C Make로 C 수학 라이브러리에 링크하는 방법은 무엇입니까?

lastmoon 2023. 6. 11. 11:13
반응형

C Make로 C 수학 라이브러리에 링크하는 방법은 무엇입니까?

어떻게 추가합니까?math내 Cmake 파일의 라이브러리? 게시물은 타겟 링크 라이브러리를 추가하는 것을 언급하고 있지만, 저는 C에 대해 잘 모릅니다.추가 게시물 - 누군가 예시를 보여줄 수 있습니까?C를 사용하는 설명서를 받고 있습니다.undefined reference to 'pow'수학 헤더의 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)

많은 수학적 함수(pow,sqrt,fabs,log등)이 선언됩니다.math.h라이브러리를 연결해야 합니다.와는 달리libc자동으로 연결되어 있습니다.libm는 별도의 라이브러리이며 종종 명시적인 연결이 필요합니다.링커는 모든 라이브러리가 다음으로 시작한다고 가정합니다. 링크하기 위해libm에 링크합니다.m.

이렇게 써야 돼요.target_link_libraries(ch4 m)연결libm당신의 목표를 향해.첫 번째 인수는 대상이어야 합니다.따라서 다음 이후에 사용해야 합니다.add_executable(ch4 ch4.c)예:

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

다양한 대상의 경우 라이브러리를 추가해야 하는지 여부와 라이브러리의 이름이 어디에 있는지 테스트하는 것이 좋습니다.한 가지 방법이 있습니다.

:
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추가하지 않습니다.

저는 솔직히 이런 종류의 질문이 여전히 모던 씨메이크에 대한 적절한 답을 가지고 있지 않다는 것에 조금 놀랐습니다.요즘 권장되는(그리고 휴대용) 접근 방식은 다음과 같습니다.

find_library(MATH_LIBRARY m)
if(MATH_LIBRARY)
    target_link_libraries(MyTarget PUBLIC ${MATH_LIBRARY})
endif()

언급URL : https://stackoverflow.com/questions/34625627/how-to-link-to-the-c-math-library-with-cmake

반응형