我正在尝试从其他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程序中没有主要功能。但显然有一个。我错过了什么?
答案 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脚本在使用系统调用时运行,那么您就知道只有语法错误导致链接器错误。