我正在编写一个大致如下所示的程序:
- src/中的一些主要代码
- Demo1/中的一些代码
我将 Demo1 的内容编译为 .o ,然后编译为 .so ,并在创建主可执行文件时使用该 .so 。 (Demo1的代码在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: fatal error: cannot specify -o with -c, -S or -E with multiple files
这是什么意思?我认为添加源文件不会导致这种情况..
当然,我过去一直在同一行上使用 -c
和 -o
,除此之外 - 句子的最后部分并不是最清楚的我在语法上...(这是否意味着我不能用 {-E 当 -E 有多个文件} 指定 -o )?
我在 Ubuntu 14.04 机器上运行 gcc 4.8.4。
提前致谢。
最佳答案
-o
选项指定(单个)输出文件。当您有以下情况时,可以轻松地忽略不立即相关的选项:
gcc -c file1.c file2.c -o output.o
file1.c
或 file2.c
的输出是否进入 output.o
?
GCC 告诉您不能这样做。您必须使用:
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': '是一个目录'
,例如)。因此,使用显式输出文件进行单独编译可能是您工作的最佳方式。这也是像 make
这样的构建系统会做的事情。
关于c - 添加源文件后,gcc 不会让我使用 'just compile' c 源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39125920/