c - 添加源文件后,gcc 不会让我使用 'just compile' c 源

标签 c gcc linker shared-libraries compiler-flags

我正在编写一个大致如下所示的程序:

  • 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.cfile2.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/

相关文章:

c - 如何在ntfs中为文件创建标准信息属性

gcc - 如何在 ARM GCC 内联汇编中指定单个寄存器作为约束?

c++ - 不满意链接错误 : undefined symbol _ZN5boost6system16generic_categoryEv in java (JNI)

c++ - 如何从 .NET 生成独立的控制台应用程序

c - 从函数返回的奇怪 int

android - 如何在 Android.mk 中添加 C-only 选项?

c - 在c中打印字符串数组的第一个元素时出现段错误

c++ - 无法使用带有 g++ 的 -std 标志进行编译

c++ - 安装 RPM 时对 libstdc++(GLIBCXX_...) 的依赖失败

c - 将 .c 文件与 main.c 文件链接