gcc不会让我只是编译'添加源文件后的源代码

时间:2016-08-24 14:20:07

标签: c gcc linker shared-libraries compiler-flags

我正在编写一个看起来大致如下的程序:

  • src /
  • 中的一些主要代码
  • Demo1 /
  • 中的一些代码

我将Demo1的东西编译成.o,然后是.so,并在创建主可执行文件时使用.so。 (演示1&#39的代码用于src /) Demo1使用已经编译的库 lib1 ,它位于一个单独的文件夹中,包含二进制文件和源代码。

我是如何构建Demo1的:

gcc -c -fpic Demo1/src/*.c -Ilib1/include -o Demo1/build/demo1.o  
gcc -shared Demo1/build/demo1.o -Llib1/lib -llib1 -o Demo1/dist/libDemo1.so

现在我已经向Demo1添加了一个新的.c文件和一个新的.h,然后当我运行构建脚本(包含上面的两个命令,等等)时发生这种情况:

  

gcc:致命错误:无法使用多个文件指定带-c,-S或-E的-o

这是什么意思?我不认为添加源文件可能会导致这种情况。
我当然在过去的同一行使用-c-o,除此之外 - 句子的最后一部分对我来说并不是最清晰的语法......(这是否意味着我无法使用 { - E,当-E有多个文件} 时指定-o?

我在Ubuntu 14.04机器上运行gcc 4.8.4 提前谢谢。

2 个答案:

答案 0 :(得分:2)

-o选项指定(单个)输出文件。当你有:

时,明智地忽略那些不直接相关的选项
gcc -c file1.c file2.c -o output.o

file1.cfile2.c的输出是否会进入output.o

海湾合作委员会告诉你,你做不到这一点。您必须使用:

gcc -c file1.c -o file1.o
gcc -c file2.c -o file2.o

或者您必须使用:

gcc -c file1.c file2.c

这就是错误信息所说的内容。

请注意,您在子目录中有源代码。编译器的默认输出将位于当前目录中。那就是:

gcc -c Demo1/file1.c Demo1/file2.c

将创建输出文件./file1.o./file2.o。 AFAIK,没有办法指定输出目录-o directory-name给出错误,例如error: unable to open output file 'directory-name': 'Is a directory'。因此,使用显式输出文件进行单独编译可能是您工作的最佳方式。它也是make等构建系统所能做到的。

答案 1 :(得分:1)

抱怨您尝试将多个.c文件编译为单个.o文件。省略链接步骤时,每个源文件将生成一个单独的输出文件。

当指定.c(仅编译)标志时,输出文件的默认名称是.o-c替换。这会将中间文件放在当前目录中。

让编译器在编译步骤中命名输出文件,并在链接步骤中包含所有目标文件:

cd Demo1/build
gcc -c -fpic ../src/*.c -Ilib1/include 
gcc -shared *.o -Llib1/lib -llib1 -o ../dist/libDemo1.so

另一种方法是将编译步骤拆分为每个源文件的一行。

正如您所看到的,这不是非常用户友好,并且在您创建更多文件时会变得混乱。

如果我是你,我会创建一个makefile(或者如果我想要简化我的简历,可以学习一些新的构建系统)。这样,您可以按照您希望的方式使用规则指定编译,然后使用单个命令进行构建。