使用gcc编译c代码的时候报错

本文记录了在编译Erlang自带的ei_interface示例时遇到的未定义引用错误,并分享了解决方案。通过在编译命令中添加-lpthread选项,成功解决了与pthread相关的函数未定义的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[b]今天编译erlang自带的ei_interface的例子时,报错如下[/b]

[liufan@liufan src]$ gcc -o extprg -I/usr/local/lib/erlang/lib/erl_interface-3.7.13/include/ -L/usr/local/lib/erlang/lib/erl_interface-3.7.13/lib complex.c erl_comm.c ei.c -lerl_interface -lei
/usr/local/lib/erlang/lib/erl_interface-3.7.13/lib/libei.a(ei_pthreads.o): In function `__erl_errno_place':
/home/liufan/workspace/sourceCode/otp_src_R16B01/lib/erl_interface/src/misc/ei_pthreads.c:194: undefined reference to `pthread_once'
/home/liufan/workspace/sourceCode/otp_src_R16B01/lib/erl_interface/src/misc/ei_pthreads.c:200: undefined reference to `pthread_getspecific'
/home/liufan/workspace/sourceCode/otp_src_R16B01/lib/erl_interface/src/misc/ei_pthreads.c:209: undefined reference to `pthread_setspecific'
/home/liufan/workspace/sourceCode/otp_src_R16B01/lib/erl_interface/src/misc/ei_pthreads.c:210: undefined reference to `pthread_getspecific'
/usr/local/lib/erlang/lib/erl_interface-3.7.13/lib/libei.a(ei_pthreads.o): In function `erl_errno_key_alloc':
/home/liufan/workspace/sourceCode/otp_src_R16B01/lib/erl_interface/src/misc/ei_pthreads.c:171: undefined reference to `pthread_key_create'
/usr/local/lib/erlang/lib/erl_interface-3.7.13/lib/libei.a(ei_pthreads.o): In function `ei_m_trylock':
/home/liufan/workspace/sourceCode/otp_src_R16B01/lib/erl_interface/src/misc/ei_pthreads.c:138: undefined reference to `pthread_mutex_trylock'
collect2: ld returned 1 exit status

[b]经过再网上搜索得到需要再编译选项里加上-lpthread,经改正后,编译正常通过,效果如下:[/b]

[liufan@liufan src]$ gcc -o extprg -I/usr/local/lib/erlang/lib/erl_interface-3.7.13/include/ -L/usr/local/lib/erlang/lib/erl_interface-3.7.13/lib complex.c erl_comm.c ei.c -lerl_interface -lei -lpthread
[liufan@liufan src]$

[b]在运行的时候按照文档里的步骤执行[/b]

Erlang R16B01 (erts-5.10.2) [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V5.10.2 (abort with ^G)
1> c(complex2).
complex2.erl:43: Warning: variable 'Reason' is unused
{ok,complex2}
2> comp
compile complex2
2> complex2:start("extprg").
<0.40.0>
3> sh: line 0: exec: extprg: not found

[b]却和文档写的不一样,经过自己修改后正确[/b]

Erlang R16B01 (erts-5.10.2) [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V5.10.2 (abort with ^G)
1> complex2:start("./extprg").
<0.34.0>
2>
2> complex2:foo(3).
4
3> complex2:bar(5).
10
4> complex2:st
start/1 stop/0
4> complex2:stop().
stop
<think>好的,我现在要回答用户关于如何在Ubuntu上用GCC编译C程序并进行代码修改的问题。首先,我需要回忆一下相关的步骤和用户提供的引用内容。 用户提到的引用[1]、[2]、[3]、[4]都涉及在Ubuntu下使用GCC和Makefile编译C程序。根据这些引用,我需要整理出基本的编译流程,然后重点说明如何在修改代码后重新编译。可能需要分步骤讲解,比如编辑代码、保存、重新编译、运行。同时,用户可能想知道如何高效地进行修改和测试,特别是多次修改的情况,这时候Makefile可能会派上用场,因为引用[3]提到Makefile可以简化重复编译的步骤。 首先,我应该从安装GCC开始,确保用户已经安装了必要的工具。然后,用vim或nano编辑C文件,比如hello.c,保存后使用gcc命令编译。如果用户修改了代码,只需要再次运行gcc命令即可生成新的可执行文件。这里可能需要提到每次修改后都需要重新编译,而使用Makefile可以自动化这个过程,尤其是在多文件项目中。 另外,引用[4]中的例子使用gcc hello.c -o hello,这个命令应该被包含在步骤中。同时,在修改代码时,用户可能需要使用文本编辑器,比如vim,如何保存退出也是需要说明的,比如在vim中输入:wq。 可能还需要提醒用户注意编译时的错误信息,如果修改后的代码有语法错误,GCC报错,这时候需要根据错误信息调整代码。此外,Makefile的使用可以进一步简化流程,用户只需要运行make命令即可自动编译,不需要每次都输入完整的gcc命令。 总结一下,步骤可能是: 1. 安装GCC 2. 编辑C文件(比如使用vim) 3. 保存修改 4. 重新编译 5. 运行测试 6. (可选)使用Makefile自动化编译 需要确保每个步骤都清晰,并引用相关的引用内容来支持说明。例如,引用[3]提到gcc分四个步骤处理,而Makefile可以简化多文件编译,所以当用户多次修改代码时,使用Makefile会更高效。 另外,用户的问题是如何在修改代码后进行编译,因此重点在于编辑和重新编译的循环过程。可能需要强调修改后的保存操作,以及重新执行gcc命令的必要性。如果用户使用Makefile,可以创建一个Makefile文件,里面写好编译指令,之后每次修改代码后只需运行make命令,这可以节省时间,特别是项目较大时。 最后,生成相关问题,比如如何调试、如何处理多个文件、如何优化编译过程等,这些都是用户可能感兴趣的后续问题。</think>在Ubuntu系统中使用GCC编译C程序并修改代码的步骤如下: --- ### **1. 安装GCC编译器** 若未安装GCC,需先执行以下命令: ```bash sudo apt update sudo apt install gcc ``` 验证安装: ```bash gcc --version ``` --- ### **2. 编写/修改C程序** - **编辑代码**:使用文本编辑器(如`vim`或`nano`)修改代码文件。例如: ```bash vim hello.c ``` - **保存修改**:在`vim`中按`Esc`键进入命令模式,输入`:wq`保存并退出[^4]。 --- ### **3. 重新编译修改后的代码** 使用GCC重新编译修改后的文件: ```bash gcc hello.c -o hello ``` - `hello.c`为源文件,`-o hello`指定输出可执行文件名[^4]。 - 若代码有语法错误,GCC会输出错误信息,需根据提示修正代码后再次编译。 --- ### **4. 运行程序** 执行生成的可执行文件: ```bash ./hello ``` --- ### **5. 使用Makefile自动化编译(推荐)** 对于频繁修改的场景,可创建`Makefile`文件: ```makefile # Makefile示例 all: hello hello: hello.c gcc hello.c -o hello clean: rm -f hello ``` - **编译**:运行`make`命令自动编译修改后的文件[^3]。 - **清理**:运行`make clean`删除旧编译文件。 --- ### **关键点** 1. **修改后必须重新编译**,否则运行的是旧版本程序。 2. **错误排查**:若编译失败,需根据GCC报错信息定位代码问题。 3. **自动化工具**:使用`Makefile`可避免重复输入编译命令,提升效率[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值