免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 12618 | 回复: 54
打印 上一主题 下一主题

如何在C中执行动态生成的代码 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-24 10:27 |只看该作者 |倒序浏览
本帖最后由 shecx 于 2012-05-24 10:28 编辑

我写了个C程序,假设为A.c,并且在执行的过程中,该程序会生成一个文件,假设为B.c,其中动态生成了某些函数,那么,我如何在A.c中执行B.c中的代码呢?当然,B.c中的函数名是确定好的。

有一个思路是这样,就是在A.c中先声明B.c中的函数(但不定义,因为定义在B.c中了),然后在需要的地方调用它。
然后,执行完A.c后,生成了B.c,再将两个文件A.c与B.c合并在一起编译链接成一个完整的程序。

但是上面的思路有个问题,就是在A.c中先声明B.c的函数,并在需要的地方调用它,链接器将无法链接,因为A.c的函数只有声明,却未有定义

请教高手有什么办法可以解决,或者其他方法也行,但我的代码却必须是通过这种方式动态生成的

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2012-05-24 10:32 |只看该作者
生成的代码必须是C代码么?
限制了C,可以考虑下tcc,否则其他类型的脚本语言很多。
当然调用gcc之类的编译器也是一种办法,就是太重量级了

论坛徽章:
0
3 [报告]
发表于 2012-05-24 10:34 |只看该作者
换一种思路吧!

论坛徽章:
0
4 [报告]
发表于 2012-05-24 10:36 |只看该作者
回复 3# aychxm


    没思路啊,关键是我的代码只能是动态生成的,很麻烦

论坛徽章:
0
5 [报告]
发表于 2012-05-24 10:38 |只看该作者
回复 2# hellioncu


    不是编译器的问题啊,是我原来的A.c文件与B.c文件依赖关系导致的,我的B.c文件又必须是动态生成的

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
6 [报告]
发表于 2012-05-24 10:45 |只看该作者
shecx 发表于 2012-05-24 10:38
回复 2# hellioncu


不知道是我没看明白你的问题还是你没看明白我的回复。

论坛徽章:
0
7 [报告]
发表于 2012-05-24 10:57 |只看该作者
回复 6# hellioncu


    呵,麻烦说的详细一点,我的确有些不明白你的意思。

  不过我再说明一下我的意图:我的目的就是在A.c中能动态生成B.c,并且希望在A.c中能执行B.c中的代码。
  因此,我在我的A.c文件中加入动态生成B.c的代码,并且,我在A.c文件中也加入执行B.c代码中的函数的代码。但关键问题是,当我编译链接A.c时,就出错了,原因是链接A.c时,找不到B.c中的代码来链接,因为B.c是靠A.c生成的,而此时A.c未执行当然就未生成了。
  这就是我的问题所在。。。
  

论坛徽章:
0
8 [报告]
发表于 2012-05-24 11:01 |只看该作者
在A.c中调用gcc把B.c编译成B.so,然后在A.c里面dlopen("B.so")、dlsym之类的,就可以调用B.c里面的函数了。

systemtap就是这么做的。这是成熟可靠的方法。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
9 [报告]
发表于 2012-05-24 11:03 |只看该作者
shecx 发表于 2012-05-24 10:57
回复 6# hellioncu

似乎你的思路不明确啊.

论坛徽章:
0
10 [报告]
发表于 2012-05-24 11:18 |只看该作者
本帖最后由 shecx 于 2012-05-24 11:19 编辑

感谢各位的回复,不过我的问题似乎还是有些不明
假设我的A.c如下

// 动态生成B.c代码
void build() {
    File * pFile = fopen("B.c", "wt");
    fprintf("void other() { }", pFile);
    // 省略
}

// 声明B.c中的函数other,但定义在B.c中
void other();

void main() {
    build();  // 生成B.c与函数other()
   
    other(); // 执行B.c中的other(),问题在此,就是因为B.c还未生成,链接器将报错
}

当然,当我生成了B.c后,我还是需要将A.c与B.c合并链接的,但问题就是B.c都无法生成,避免不了链接器的检查

上面的问题我是说了个大概,其中省略了某些细节,请教大家有没有其他方法或思路
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP