精华内容
下载资源
问答
  • c c++ "undefined reference to" 问题解决方法
     最近在Linux下编程发现一个诡异的现象,就是在链接一个静态库的时候总是报错,类似下面这样的错误:
    
    1. (.text+0x13): undefined reference to `func' 

        关于undefined reference这样的问题,大家其实经常会遇到,在此,我以详细地示例给出常见错误的各种原因以及解决方法,希望对初学者有所帮助。

    1.  链接时缺失了相关目标文件(.o)

        测试代码如下:

     

        然后编译。

    1. gcc -c test.c  
    2. gcc –c main.c 

        得到两个 .o 文件,一个是 main.o,一个是 test.o ,然后我们链接 .o 得到可执行程序:

    1. gcc -o main main.o 

        这时,你会发现,报错了:

    1. main.o: In function `main':  
    2. main.c:(.text+0x7): undefined reference to `test'  
    3. collect2: ld returned 1 exit status 

        这就是最典型的undefined reference错误,因为在链接时发现找不到某个函数的实现文件,本例中test.o文件中包含了test()函数的实现,所以如果按下面这种方式链接就没事了。

    1. gcc -o main main.o test.o 

       【扩展】:其实上面为了让大家更加清楚底层原因,我把编译链接分开了,下面这样编译也会报undefined reference错,其实底层原因与上面是一样的。

    1. gcc -o main main.c //缺少test()的实现文件 

    需要改成如下形式才能成功,将test()函数的实现文件一起编译。

    1. gcc -o main main.c test.c //ok,没问题了 

    2.    链接时缺少相关的库文件(.a/.so)

        在此,只举个静态库的例子,假设源码如下。

        先把test.c编译成静态库(.a)文件

    1. gcc -c test.c  
    2. ar -rc test.a test.o 

        至此,我们得到了test.a文件。我们开始编译main.c

    1. gcc -c main.c 

        这时,则生成了main.o文件,然后我们再通过如下命令进行链接希望得到可执行程序。

    1. gcc -o main main.o 

        你会发现,编译器报错了:

    1. /tmp/ccCPA13l.o: In function `main':  
    2. main.c:(.text+0x7): undefined reference to `test'  
    3. collect2: ld returned 1 exit status 

        其根本原因也是找不到test()函数的实现文件,由于该test()函数的实现在test.a这个静态库中的,故在链接的时候需要在其后加入test.a这个库,链接命令修改为如下形式即可。

    1. gcc -o main main.o ./test.a  //注:./ 是给出了test.a的路径 

         【扩展】:同样,为了把问题说清楚,上面我们把代码的编译链接分开了,如果希望一次性生成可执行程序,则可以对main.c和test.a执行如下命令。

    1. gcc -o main main.c ./test.a  //同样,如果不加test.a也会报错 

    3.    链接的库文件中又使用了另一个库文件

        这种问题比较隐蔽,也是我最近遇到的与网上大家讨论的不同的问题,举例说明如下,首先,还是看看测试代码。

        从上图可以看出,main.c调用了test.c的函数,test.c中又调用了fun.c的函数。
        首先,我们先对fun.c,test.c,main.c进行编译,生成 .o文件。

    1. gcc -c func.c  
    2. gcc -c test.c  
    3. gcc -c main.c 

        然后,将test.c和func.c各自打包成为静态库文件。

    1. ar –rc func.a func.o  
    2. ar –rc test.a test.o 

        这时,我们准备将main.o链接为可执行程序,由于我们的main.c中包含了对test()的调用,因此,应该在链接时将test.a作为我们的库文件,链接命令如下。

    1. gcc -o main main.o test.a 

        这时,编译器仍然会报错,如下:

    1. test.a(test.o): In function `test':  
    2. test.c:(.text+0x13): undefined reference to `func'  
    3. collect2: ld returned 1 exit status 

        就是说,链接的时候,发现我们的test.a调用了func()函数,找不到对应的实现。由此我们发现,原来我们还需要将test.a所引用到的库文件也加进来才能成功链接,因此命令如下。

    1. gcc -o main main.o test.a func.a 

        ok,这样就可以成功得到最终的程序了。同样,如果我们的库或者程序中引用了第三方库(如pthread.a)则同样在链接的时候需要给出第三方库的路径和库文件,否则就会得到undefined reference的错误。

    4 多个库文件链接顺序问题

        这种问题也非常的隐蔽,不仔细研究你可能会感到非常地莫名其妙。我们依然回到第3小节所讨论的问题中,在最后,如果我们把链接的库的顺序换一下,看看会发生什么结果?

    1. gcc -o main main.o func.a test.a 

        我们会得到如下报错.

    1. test.a(test.o): In function `test':  
    2. test.c:(.text+0x13): undefined reference to `func'  
    3. collect2: ld returned 1 exit status 

        因此,我们需要注意,在链接命令中给出所依赖的库时,需要注意库之间的依赖顺序,依赖其他库的库一定要放到被依赖库的前面,这样才能真正避免undefined reference的错误,完成编译链接。

    5. 在c++代码中链接C语言的库

        如果你的库文件由c代码生成的,则在c++代码中链接库中的函数时,也会碰到undefined reference的问题。下面举例说明。

        首先,编写c语言版库文件: 

        

        编译,打包为静态库:test.a

    1. gcc -c test.c  
    2. ar -rc test.a test.o 

        至此,我们得到了test.a文件。下面我们开始编写c++文件main.cpp

        

        然后编译main.cpp生成可执行程序:

    1. g++ -o main main.cpp test.a 

        会发现报错:

    1. /tmp/ccJjiCoS.o: In function `main': 
    2. main.cpp:(.text+0x7): undefined reference to `test()' 
    3. collect2: ld returned 1 exit status 

        原因就是main.cpp为c++代码,调用了c语言库的函数,因此链接的时候找不到,解决方法:即在main.cpp中,把与c语言库test.a相关的头文件包含添加一个extern "C"的声明即可。例如,修改后的main.cpp如下:

        

    1. g++ -o main main.cpp test.a 

        再编译会发现,问题已经成功解决。



    以上内容转载自 http://blog.csdn.net/aiwoziji13/article/details/7330333/

    展开全文
  • c c++ 画点 画线

    千次阅读 2014-07-06 19:34:57
    c c++ 画点 画线 #include int main( void ) {  // 获取一个可供画图的DC,我这里就直接用桌面算了  HDC hdc = GetWindowDC( GetDesktopWindow() );  // 创建红色1像素宽度的实线画笔  HPEN ...












    c++ 画点 画线



    http://hi.baidu.com/xulei1143/item/73c7340dc9cf0231a3332a26





    c

     



    http://zhidao.baidu.com/link?url=tqGnqx8Pu7a-nX-P_caMrwPKVsdNDGkcnvIWnE7gmIgDu0HOg-Qj500X4BPPHNLvuQ3arrE4UVqJfZz5hMWr2_

    #include<windows.h>

    int main( void )
    {
         // 获取一个可供画图的DC,我这里就直接用桌面算了
         HDC hdc = GetWindowDC( GetDesktopWindow() );

         // 创建红色1像素宽度的实线画笔
         HPEN hpen1 = CreatePen( PS_SOLID, 1, RGB(255,0,0) );
         // 创建绿色5像素宽度的破折画笔,如果你想创建其他种类的画笔请参阅MSDN
         HPEN hpen2 = CreatePen( PS_DASH, 5, RGB(0,255,0) );
         // 创建一个实体蓝色画刷
         HBRUSH hbrush1 = CreateSolidBrush( RGB(0,0,255) );
         // 创造一个透明的画刷,如果你想创建其他种类的画刷请参阅MSDN
         HBRUSH hbrush2 = (HBRUSH)GetStockObject( NULL_BRUSH );

         // 将hpen1和hbrush1选进HDC,并保存HDC原来的画笔和画刷
         HPEN hpen_old = (HPEN)SelectObject( hdc, hpen1 );
         HBRUSH hbrush_old = (HBRUSH)SelectObject( hdc, hbrush1 );

         // 在(40,30)处画一个宽200像素,高50像素的矩形
         Rectangle( hdc, 40, 30, 40+200, 30+50 );

         // 换hpen1和hbrush1,然后在(40,100)处也画一个矩形,看看有何差别
         SelectObject( hdc, hpen2 );
         SelectObject( hdc, hbrush2 );
         Rectangle( hdc, 40, 100, 40+200, 100+50 );

         // 画个椭圆看看
         Ellipse( hdc, 40, 200, 40+200, 200+50 );

         // 画个(0,600)到(800,0)的直线看看
         MoveToEx( hdc, 0, 600, NULL );
         LineTo( hdc, 800, 0 );

         // 在(700,500)处画个黄点,不过这个点只有一像素大小,你细细的看才能找到
         SetPixel( hdc, 700, 500, RGB(255,255,0) );

         // 恢复原来的画笔和画刷
         SelectObject( hdc, hpen_old );
         SelectObject( hdc, hbrush_old );

         return 0;
    }

    展开全文
  • 做Android开发的都知道,Android可以通过JNI来和C C++打交道。当然这一块涉及到知识点也比较多,要对CC++有基本的掌握,还要了解静态库和动态库,关于静态库和动态库这一块的知识点,后面我再记录一下自己的学习...

    做Android开发的都知道,Android可以通过JNI来和C C++打交道。当然这一块涉及到知识点也比较多,要对C和C++有基本的掌握,还要了解静态库和动态库,关于静态库和动态库这一块的知识点,后面我再记录一下自己的学习分享,这里先介绍如何使用Android Studio来打包我们C代码,以库的方式来提供给自己或者别人使用。要想掌握好这一块的知识点,还是需要不断尝试,不断摸索。

    创建工程

    首先我们先创建好工程,选择 include C++ support

    在这里插入图片描述

    这里我们先大致的看一下这个支持C++的项目和我们平时的有什么不一样。

    在这里插入图片描述

    从文件结构上看,项目多了一个CMakeLists.txt ,后面我们的一些操作也会在这个文件上。然后再看一下gradle文件有啥不一样。在这里插入图片描述

    图上标出来的这段代码,应该就是配置CMakeLists.txt了。

    编写C++代码

    打开项目路径,能看到项目自动生成了一个cpp文件夹,里面有一个自动生成的native-lib.cpp文件,在MainActivity中也有相关的调用代码。
    在这里插入图片描述

    这里我们先编译一下工程,然后查看一下build文件,如下图所示,这个libnative-lib.so就是默认替我们生成的C++动态库。

    在这里插入图片描述

    查看一下我们CMakeLists.txt 中的代码,我们就明白了。
    在这里插入图片描述

    native-lib 表示要生成的库的名字,SHARED表示动态库 , src/main/cpp/native-lib.cpp表示C++文件路径,接下来我们就参考默认工程的一些信息来改造一下,把我们自己的一些普通C C++文件打包成库。先把这些默认生成的代码给删了,然后如下图所示,创建test.cpp文件
    在这里插入图片描述
    修改CMakeLists.txt 文件如下图所示:
    在这里插入图片描述
    编译之后,在build文件夹下,cmake文件夹下生成libtest-lib.so动态库文件。我们将这个库文件拷贝到Linux系统下,使用命令查看函数名字。
    在这里插入图片描述
    可以看到,这里函数的名字和我们cpp文件中不一样,这里我也暂时不能解释为什么,后面研究一下,再补上,如果有大神看到了能解释,还希望大神指点一下。之后如果我们要调用的话,只要引入这个so库文件,然后使用so库文件中的函数名调用,这里很是不完美,待我研究出问题所在,再补上解释。

    参考文章

    这里给个链接,有更好的方案 https://blog.csdn.net/ma598214297/article/details/78312992

    展开全文
  • EditPlus 配置C C++环境

    千次阅读 2014-04-30 21:41:30
    EditPlus 配置C C++环境



    EditPlus 配置C  C++环境


    一直比较喜欢EditPlus,启动快,不要像VS那样的航母般强大的功能,前期学习,能敲代码就行。
    我选择的MinGW +EditPlus来搭建一个简易的C C++开发环境。


    安装MinGW

    电脑的系统是x64的,所以选择了64位的MinGW64。

    安装过程和一般的软件安装没有什么差别。
    安装好之后的目录:



    配置环境变量


    安装好MinGW 就是为了使用editplus调用GCC和G++的,但安装好之后不能再cmd中调用,还需将安装的目录中的bin目录加入环境变量。

    我的安装目录:
    D:\MinGW
    bin目录:
    D:\MinGW\mingw64\bin,在bin目录下包含了常用的命令。



    测试环境配置是否成功:
    cmd下输入 gcc -v 可查看版本;


    配置EditPlus

    在工具上选择配置自定义工具:



    GCC编译的配置:


    GCC的命令 :

    gcc   需要编译的文件.c  -o  需要生成的文件名  -Wall   -std=c99

    -Wall 是将极可能多的报出错误。
    -std=c99 使用c99标准,比如只有在C99标准下才支持在for()内定义int i=0之类的操作,支持变长数组。
    但后缀名保存为cpp将会报错,加-std=c99将不可以编译 c++,C++没有C99这个标准。

    GCC 运行:



    G++编译:



    G++运行:




    展开全文
  • C C++如何获取当前系统时间

    万次阅读 多人点赞 2017-07-26 23:37:30
    C库中与系统时间相关的函数定义在头文件中, C++定义在头文件中。获取系统时间的方法都在time头文件里面定义。
  • 全套C C++ 编程视频课程收录

    千次阅读 2017-10-27 14:58:48
    【C语言】 小白可以短时间很快入门的《从小白入门C语言视频课程》 ... 然后C语言中为核心知识点,附上指《C语言指针精讲视频课程》 ... 指针是重点《30分钟学会C语言指针视频课程》 https://edu.csdn.net/cou...
  • C C++带多个参数的宏(...与__VA_ARGS__详解) 1. 环境 gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3) 2.'...'与__VA_ARGS__ 这里的...代表多个参数,在宏展开时,编译器会经...的参数替换__VA_ARGS__ ...
  • 【笔记】c c++如何打印变量地址

    万次阅读 2017-07-15 15:34:30
    cc++开发中难免遇到要查看变量地址,查看日志的模式中可以通过printf函数来打印变量地址。本文将给出示例演示如何打印变量地址
  • python与C C++的交互(一)

    千次阅读 2018-05-16 10:05:35
    C/C++是一种“性能”编程语言,较为古老且经典,因与unix,linux,windows这些底层操作系统相关,而得到广泛应用。Python从一开始就支持C语言的“嵌入”,这是python为弥补性能不足的一种措施,其实python的库就是用C...
  • 类似于大漠插件的,dm.findstr 函数,还有,ocr控件怎么用?有源码吗?
  • C C++编程产生指定范围内的随机数

    千次阅读 2016-05-12 18:32:59
    C/C++编程产生指定范围内的随机数,直接上个小程序: #include // 对应于C++中cstdlib #include // ctime #include int main() { srand(time(NULL)); int low = 0, high = 100; int rnum = rand() % (high - ...
  • GCC G++ C C++的区别

    千次阅读 2010-04-13 16:22:00
    gcc 是c的编译器,g++是c++的编译器。cc一般是一个符号连接,指向gcc。 CC一般是makefile里面的一个名字,具体是什么根据实际情况决定。 gcc和g++都是GNU(组织)的一个编译器。 误区一:gcc只能编译c代码,g++只能...
  • 字符串相减 c c++

    千次阅读 2011-06-03 09:50:00
    string a = "goodluck"string b = "luck" int length= strlen(a.c_str()) - strlen(b.c_str());string c = a.substr(0, length); 主要是substr()的用法 返回一个从指定位置开始,并具有指定长度的子字符串。 参数 ...
  • 今天看了小编推荐的一篇文章“恐怖的C++语言” 文章地址:http://blog.csdn.net/haoel/archive/2009/12/04/4938200.aspx 我说下我的意见吧,我虽然是菜鸟,但开始学到时候也是先CC++的,现在在用C++builder做...
  • C C++ 数字后面加 LL是什么意思

    千次阅读 2019-03-10 13:55:00
    long long类型,在赋初值的时候,如果大于2的31次方-1,那么后面需要加上LL 转载于:https://www.cnblogs.com/lxzbky/p/10505135.html
  • C C++ string转char*

    万次阅读 2009-12-08 15:10:00
    string 是c++标准库里面其中一个,封装了对字符串的操作 把string转换为char* 有3中方法: 1。data 如: string str="abc"; char *p=str.data(); 2.c_str 如:string str="gdfd"; char *p=str.c_str(); 3 copy 比如 ...
  • centos 安装 gcc g++ 编译器 c c++ 编译器

    万次阅读 2013-08-25 15:06:16
    安装gcc编译器使用命令:  yum -y install gcc 安装g++编译器使用命令:  yum -y install gcc-c++ (不能使用yum -y install g++,否则提示没有g++这个包名)
  • //返回0:无中文,返回1:有中文 ... char c;  while(c=*str++)  {  //如果字符高位为1且下一字符高位也是1则有中文字符  if( (c&0x80) && (*str & 0x80) )  {  nRet = 1;  break;
  • 调用函数时传递数组和字符串函数时传递的是数组或字符串的地址,如a[100]的数组作实参时,可以写成min_1(m,a),传递给函数数组或串的首地址,函数内部将对地址指向的内容进行读写操作。...
  • 电子书籍(c c++类)

    千次阅读 热门讨论 2006-01-10 18:22:00
    欲贡献出来和大家分享,由于太多(进2000本)无法一一列出,有谁急需某本电子书的话可以,可以在本页后面回复电子书的名称和你的email,我会及时发给你Addison Wesley - Applied C++ Techniques for Building Better...
  • 基于Dev-C++ 5.11版本! 代码: #include&amp;amp;amp;amp;amp;lt;iostream&amp;amp;amp;amp;amp;gt; using namespace std; int main() { printf(&amp;amp;amp;amp;quot;%f\n&amp;amp;...
  • C/C++产生随机数

    万次阅读 多人点赞 2010-11-15 13:34:00
    越来越厌恶CSDN的盈利模式 本文已转移至https://www.cnblogs.com/isky0824/p/12096575.html
  • C/C++ 开发神器 CLion 使用入门

    万次阅读 多人点赞 2018-10-23 14:18:19
    CLion是Jetbrains公司旗下新推出的一款专为开发C/C++所设计的跨平台IDE,它是以IntelliJ为基础设计的,同时还包含了许多智能功能来提高开发人员的生产力。 同样支持python哦,相信使用过IntelliJ idea开发过java的...
  • 由于这学期(或者说这一年)一直在忙别的,也没什么闲心看博客了,近期发现自己的这篇文章:整理:Visual Studio Code (vscode) 配置CC++环境/编写运行CC++(Windows)竟然有了好多访问,也有不少童鞋问各种问题...
  • C/C++ 的*和& 详解

    万次阅读 多人点赞 2018-09-27 12:04:10
    C/C++ *和&amp; 详解 C/C++中 * 的用法 1&gt;最简单的乘法: a*b; 2&gt;可以注释: /**/ 3&gt;指针:(最重要) 指针是指向变量的地址 简单的例子分析: int main() { int a = 3; int *b = &...
  • C++C++中的C

    千次阅读 多人点赞 2017-12-07 17:49:36
    C++兼容C,但同样的东西,在C++C中的表现可能不同,下面总结了一些。1、函数空参int f();函数空参时,C表示任意参数,C++表示没有参数。int f(void);C表示没有参数时使用void。2、函数参数标识符int f(int a); int...
  • CC++

    千次阅读 多人点赞 2020-03-05 08:41:17
    文章目录一、C++程序的命名规则二、C++程序的编译1、安装g++编译器2、编译C++程序在这里插入图片描述 三、C++是面向对象语言四、C++输入和输出五、C++异常六、C++命名空间...C++ 读作“C加加”,是“C Plus Plus”的...
  • C/C++程序员实战基础

    万人学习 2019-08-20 08:46:21
  • c/c++笔记本

    千次阅读 多人点赞 2012-08-18 12:44:00
    C/C++  基础  C/C++基本数据类型  C++选择语句  C++循环语句  C++函数  C++指针详解  C/C++ typedef用法  C++ struct,union和enum  C++类和对象  C++类复制构造函数  C++继承  C++虚函数 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 367,771
精华内容 147,108
关键字:

cc++

c++ 订阅