从c程序调用时,gcc会出错

时间:2014-07-31 13:07:43

标签: c bash gcc

我正在尝试从其他c程序编译一个简单的c文件。我通过一个简短的shell脚本调用gcc(我知道我可以直接执行此操作,但这是一个测试)。这是我的代码:

我的主要节目(小片):

    char strCommand[100];
    sprintf(strCommand, "./compile.sh %s %u", fileName, nr);

    FILE *pipe = popen(strCommand, "r");
    if (pipe == NULL) {
        perror("Unable to open compile script");
        exit(-1);
    }

    char path[LINE_BUFSIZE];
    while (fgets(path, LINE_BUFSIZE, pipe) != NULL)
           printf("%s", path);

    pclose(pipe);

我的shell脚本:

#!/bin/bash 
gcc $1 -o foo-$2

应该编译的文件;-):

#include <stdio.h>
#include <stdlib.h>

int main(){
    printf("Hello world");
}

当我直接从终端调用bash脚本时,一切正常。但是,当从c程序调用我的脚本时,会发生以下错误:

/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 11
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 1 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 2 has invalid symbol index 2
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 3 has invalid symbol index 2
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 4 has invalid symbol index 11
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 5 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 6 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 7 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 8 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 9 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 10 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 11 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 12 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 13 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 14 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 15 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 16 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 17 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 18 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 19 has invalid symbol index 21
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_line): relocation 0 has invalid symbol index 2
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status

此错误表示我的Hello World程序中没有主要功能。但显然有一个。我错过了什么?

2 个答案:

答案 0 :(得分:1)

确保您的hello world程序具有.c扩展名而不是.cpp(或类似)扩展名

gcc可以编译C ++程序,但它不链接在C ++标准库中,它链接在标准C库中。

如果您的程序是C ++,那么您的主要功能将被破坏名称,这将解释为什么C库无法找到它。

如果要使用C ++标准库编译C ++,请使用g ++。

答案 1 :(得分:-1)

您可以尝试使用C中的system函数来调用bash脚本。

system("bash /path/to/compile.sh %s %u");

我经常使用这种非常简单的方法。只需确保使用#include <stdlib.h>

您收到的错误是链接器错误。通常是由于您没有在尝试运行的C / C ++代码中定义int main()而导致它。虽然hello world C代码编译并运行正常,但您的主C代码可能缺少int main()函数。检查以确保主程序具有int main()功能,如果仍然遇到链接器错误,请使用system调用函数,该函数将命令发送到linux框上的默认shell解释器。在Ubuntu中,这通常是bash。如果shell脚本在使用系统调用时运行,那么您就知道只有语法错误导致链接器错误。