【问题标题】:How to link to the C math library with CMake?如何使用 CMake 链接到 C 数学库?
【发布时间】:2016-04-10 02:25:06
【问题描述】:

如何将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)

【问题讨论】:

  • 为什么要设置 CXX 标志?这些是针对 C++ 而不是 C。而且您还没有为您的项目定义语言,应该是 enable_language(C)

标签: c cmake


【解决方案1】:

许多数学函数(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)

【讨论】:

  • 令人惊讶的是,Windows 上的 Cygwin 不需要它。但遗憾的是 *nix 需要。
  • 你能写出完整的正确答案吗? m 是占位符吗?还是只是众所周知math.c 在一个名为m 的库中?还是以我在上面的脚本中无法理解的方式声明?
  • 太棒了,我现在明白了。我链接到一个我之前问过的问题,关于“libm”如何变成“m”只是为了完整性。
  • 使用 MSVC 会导致以下构建错误:[CMake] LINK : fatal error LNK1104: cannot open file 'm.lib'
  • 我正在尝试从源代码构建GLFW,而CMakeLists.txt 中没有add_executable 行。我该怎么办?
【解决方案2】:

对于各种目标,最好测试是否需要添加库,如果需要,它位于何处以及如何命名。这是一种方法:

:
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 不会尝试添加。

【讨论】:

    猜你喜欢
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 2013-04-03
    • 1970-01-01
    • 2017-03-04
    相关资源
    最近更新 更多