我正在编写一个看起来大致如下的程序:
我将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 提前谢谢。
答案 0 :(得分:2)
-o
选项指定(单个)输出文件。当你有:
gcc -c file1.c file2.c -o output.o
file1.c
或file2.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
(或者如果我想要简化我的简历,可以学习一些新的构建系统)。这样,您可以按照您希望的方式使用规则指定编译,然后使用单个命令进行构建。