Makefile中未完成链接
Linking not done in Makefile
我尝试使用main.cpp、factorial.cpp、hello.cpp和function.h文件制作Makefile在Linux命令窗口中键入"make"时,会显示:
g++ -c -o hello main.o factorial.o hello.o
g++: main.o: linker input file unused because linking not done
g++: factorial.o: linker input file unused because linking not done
g++: hello.o: linker input file unused because linking not done
我是第一次制作Makefile。请给出建议,问题出在哪里?Makefile包含以下代码->
hello: main.o factorial.o hello.o
g++ -c -o hello main.o factorial.o hello.o
main.o: main.cpp
g++ -c -o main.o main.cpp
factorial.o: factorial.cpp
g++ -c -o factorial.o factorial.cpp
hello.o: hello.cpp
g++ -c -o hello.o hello.cpp
如果要查看单个文件内容,请执行以下操作:1) main.cpp
#include<iostream>
#include"functions.h"
using namespace std;
int main()
{
print_hello();
cout << endl;
cout << "The factorial of 5 is " << factorial(5) << endl;
return 0;
}
2) 你好.cpp
#include<iostream>
#include "functions.h"
using namespace std;
void print_hello()
{
cout << "Hello World!";
}
3) factorial.cpp
#include "functions.h"
int factorial(int n)
{
if(n!=1)
{
return(n * factorial(n-1));
}
else return 1;
}
4) 函数.h
void print_hello();
int factorial(int n);
g++
的-c
参数告诉它不要链接:
-c编译或汇编源文件,但不要链接。链接阶段根本没有完成。最终输出的形式是每个源文件的一个对象文件。
你肯定不想要这里的-c
:
hello: main.o factorial.o hello.o
g++ -c -o hello main.o factorial.o hello.o
您还可以使用规则和模式使其更通用:
SRC_DIR = ./src
OBJ_DIR = ./bin/obj
BIN_DIR = ./build/bin
# List all the sources
SRCS = A.cpp B.cpp
# Define the rule to make object file from cpp
$(OBJ_DIR)/%.o : $(SRC_DIR)/%.cpp
g++ -o $@ $(INCLUDES) $(CPPFLAGS) -c $^
TARGET_BIN = $(BIN_DIR)/test
all : make_dirs $(TARGET_BIN)
$(TARGET_BIN) : $(SRCS:%.cpp=$(OBJ_DIR)/%.o)
g++ $(LDFLAGS) -o $@ $^ $(LDLIBS)
make_dirs :
mkdir -p $(OBJ_DIR)
mkdir -p $(BIN_DIR)
使用这种方法,您有几个好处:
易于使用:只需指定一次源文件,不必关心每个对象文件的处理:这项工作由一条规则完成。
更易于维护:每次需要更改编译器或链接器选项时,都可以在单个规则中进行,而不是针对每个翻译单元。
那一行有一个错误:
g++ -c -o hello main.o factorial.o hello.o
man gcc说:... the -c option says not to run the linker.
此选项仅用于生成对象文件。当它通过时,gcc将不会启动链接器来生成可执行文件或共享库。
从以上所有答案中可以清楚地看出,由于在g++ -c -o hello main.o factorial.o hello.o
中使用-c
,它阻止了链接。从相应的.cpp或.h等文件创建对象文件后,需要链接这些文件。如果没有链接,由于每个文件都是可以执行某些任务的完整程序的一部分,因此无法执行任何有用的操作,因为这些文件是依赖的。因此,我们必须将这些依赖的部分连接起来才能运行我们的完整程序。
这里有一个简单学习用依赖项和模式规则这两种方法制作Makefile的基本视频教程。它以依赖方法为例,然后引入模式规则作为制作长Makefile的更好方法。
要了解编译和链接之间的区别,此链接非常有用。
- node-gyp 在 macOS 上未正确链接库
- Cmake 链接问题:未定义对 Button::mousePressEvent(QGraphicsSceneMouseE
- 在未链接的部分上生成警告
- 链接 cmake 时出现未定义的引用错误
- 链接器输入文件未使用,因为链接未完成,我无法获得.o
- CURL 静态链接未解析的外部符号
- OCCI 链接:未定义的符号
- C++链接未定义的引用
- 如何设置 CMAKE 静态链接(未定义对 'dlopen' 的引用)?
- MFC 静态链接未解析的外部符号
- Visual Studio C++链接未使用的全局变量
- 如何在静态库中的单独 cpp 文件中链接未引用的变量
- Makefile中未完成链接
- C++链接是否足够聪明,可以避免链接未使用的库
- 链接器输入文件未使用,因为链接尚未完成
- MinGW 与 MSVC 的 dll 库问题链接(未定义的引用)
- SDL2_mixer链接未定义引用C::B
- g++.exe[警告]链接器输入文件未使用,因为链接未完成
- 将犰狳/布拉斯/拉帕克与 cmake 链接(未定义对"dgemv_"的引用)
- 在 Ubuntu 12.04 上链接 - 未定义对"clock_gettime@GLIBC_2.17"的引用