【问题标题】:linker input file unused because linking not done链接器输入文件未使用,因为链接未完成
【发布时间】:2014-09-01 20:24:58
【问题描述】:

我正在尝试在 cygwin 上编译一个简单的程序。我不知道为什么我的 IDE(Netbeans)试图使用“-c”标志。在 Project Properties->C++ compiler->Additional options 我没有'-c'标志。如何解决?

"/usr/bin/make" -f nbproject/Makefile-Release.mk QMAKE= SUBPROJECTS= .clean-conf

make[1]: Entering directory '/cygdrive/c/Users/user/Documents/NetBeansProjects/CppApplication_3'
rm -f -r build/Release
rm -f dist/Release/Cygwin-Windows/cppapplication_3.exe
make[1]: Leaving directory '/cygdrive/c/Users/user/Documents/NetBeansProjects/CppApplication_3'


CLEAN SUCCESSFUL (total time: 1s)

"/usr/bin/make" -f nbproject/Makefile-Release.mk QMAKE= SUBPROJECTS= .build-conf
make[1]: Entering directory '/cygdrive/c/Users/user/Documents/NetBeansProjects/CppApplication_3'
"/usr/bin/make"  -f nbproject/Makefile-Release.mk dist/Release/Cygwin-Windows/cppapplication_3.exe
make[2]: Entering directory '/cygdrive/c/Users/user/Documents/NetBeansProjects/CppApplication_3'
mkdir -p build/Release/Cygwin-Windows
rm -f build/Release/Cygwin-Windows/main.o.d
i686-pc-mingw32-g++ -E   -c -O2 -I/usr/include -I/usr/include/apr-1 -I/usr/include/libxml2 -I/usr/include/boost -I/usr/local/apr -std=c++11 -MMD -MP -MF build/Release/Cygwin-Windows/main.o.d -o build/Release/Cygwin-Windows/main.o main.cpp
mkdir -p dist/Release/Cygwin-Windows
i686-pc-mingw32-g++ -E    -o dist/Release/Cygwin-Windows/cppapplication_3 build/Release/Cygwin-Windows/main.o 
i686-pc-mingw32-g++: warning: build/Release/Cygwin-Windows/main.o: linker input file unused because linking not done
make[2]: Leaving directory '/cygdrive/c/Users/user/Documents/NetBeansProjects/CppApplication_3'
make[1]: Leaving directory '/cygdrive/c/Users/user/Documents/NetBeansProjects/CppApplication_3'


BUILD SUCCESSFUL (total time: 1s)

【问题讨论】:

  • -E 选项很奇怪。 man:"-E 在预处理阶段后停止;不要正确运行编译器。" -c 选项是正常的。例如见stackoverflow.com/questions/2395158/…
  • 啊...我想知道如果这是预处理器后的 C++ 代码,为什么 main.o 文件不会产生错误。它应该是链接器的不兼容输入!?

标签: c++ gcc linker g++


【解决方案1】:

-c 标志不是附加标志,它是您的 IDE 用来告诉编译器将源文件(例如 main.cpp)编译成目标文件(例如 main.o)的基本标志之一)。它也没有用在给你警告信息的命令上。

但是,另一个标志是 -E 标志,您可以看到它在两次调用 g++ 时都被使用。根据GCC documentation,这就是-E 标志的作用:

在预处理阶段后停止;不要正确运行编译器。输出形式为 预处理后的源代码,发送到标准输出。

不需要预处理的输入文件将被忽略

您看不到预处理的源代码,因为您的 IDE 提供的 -o 选项告诉它改为将其放入文件中。如果您查看build/Release/Cygwin-Windows/main.o,您会发现它是一个文本文件,其中包含通过预处理器传递源代码的结果。然而,它实际上应该是一个二进制文件,是在目标文件中编译代码的结果。

所以希望解决方案应该是显而易见的,从附加选项中删除 -E 标志。

【讨论】:

    猜你喜欢
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    相关资源
    最近更新 更多