zoukankan      html  css  js  c++  java
  • linux clion cmakelisits undefined reference 未定义引用

    【背景以及环境】

      当我们第一次在Linux下使用Clion进行编程时,可能会遇到 未定义引用 undefined reference 的情况,比如执行下面这段代码:

     1 #include <stdio.h>
     2 #include <math.h>
     3 
     4 #define N 10000000
     5 
     6 void prime_sequence();
     7 
     8 int main() {
     9     prime_sequence();
    10 }
    11 
    12 //判断一个数是否为素数,简单形式,时间复杂度高
    13 int isPrime(int n) {
    14     if(n < 2) return 0;
    15     //下面这里调用标准库函数的sqrt函数会报错
    16     double upper = sqrt((double)n);
    17     for (int i = 2; i <= upper; i++) {
    18         if (n % i == 0) return 0;
    19     }
    20     return 1;
    21 }
    22 
    23 //串行判断N以内的数有多少为素数
    24 void prime_sequence(){
    25     int cnt = 0;
    26     for (int i = 2; i <= N; i++) {
    27         if (isPrime(i)) {
    28             cnt++;
    29         }
    30     }
    31     printf("共找到%d个素数
    ", cnt);
    32 }

    第16行对 <math.h> 的 sqrt 函数引用会报错

    CMakeFiles/multi1.dir/main.c.o:在函数‘isPrime’中:
    /home/user/桌面/multi1/main.c:23:对‘sqrt’未定义的引用
    collect2: error: ld returned 1 exit status
    CMakeFiles/multi1.dir/build.make:83: recipe for target 'multi1' failed
    make[3]: *** [multi1] Error 1
    CMakeFiles/Makefile2:72: recipe for target 'CMakeFiles/multi1.dir/all' failed
    make[2]: *** [CMakeFiles/multi1.dir/all] Error 2
    CMakeFiles/Makefile2:84: recipe for target 'CMakeFiles/multi1.dir/rule' failed
    make[1]: *** [CMakeFiles/multi1.dir/rule] Error 2
    Makefile:118: recipe for target 'multi1' failed
    make: *** [multi1] Error 2

    原因是在CMake的编译器只能通过 CMakeLists.txt 获取编译的上下文

    【解决方法】

    在  CMakeLists.txt  文件中添加语句,说明编译需要依赖的标准库

    cmake_minimum_required(VERSION 3.14)
    
    # 注意:multi1是我的项目名,你应该替换成你的项目名字
    project(multi1 C)
    
    set(CMAKE_C_STANDARD 11)
    
    # main.c包括项目启动的main函数
    add_executable(multi1 main.c)
    
    # 项目名后是你需要依赖的环境,比如我需要<math.h>,那么环境需要在编译语句后添加 -lm指令,我就添加 m,
    # 比如我需要多线程支持,编译需要 -lpthread, 我就添加 pthread,等等。
    target_link_libraries(multi1 m pthread)

      【结果】

     编译运行时,控制台打印出编译时使用的语句(环境):

    /home/user/桌面/multi1/cmake-build-debug/multi1 -lm -lpthread

    【Reference】

      [1] https://stackoverflow.com/.../how-to-link-to-math-h-library-using-cmake

     
  • 相关阅读:
    php微信支付v3版签名生成,代金券、微信支付分、支付即服务等
    docker基本命令及搭建php环境
    Nginx 负载均衡搭建
    laravel4.2 union联合,join关联分组查询最新记录时,查询条件不对,解决方案
    抓取腾讯视频弹幕
    laravel4.2 Redis 使用
    201771010106-东文财 实验一 软件工程准备-<构建之法与博客首秀>
    东文财201771010106《面向对象程序设计(java)》.18
    东文财201771010106《面向对象程序设计(java)》17
    201771010106东文财《面向对象程序设计(java)》实验16
  • 原文地址:https://www.cnblogs.com/wangnig/p/11073224.html
Copyright © 2011-2022 走看看