Makefile 如何修复C++;链接器错误:架构的未定义符号?
user4581301和Ted Lyngmo还帮助指出了另一个陷阱: Rational for Ted的评论:现在每个包含该头的人都强制使用名称空间std:了,如果他们的代码还没有准备好,他们可能会在运行时得到神秘的错误,因为某些std::-homing函数被调用来代替非std::函数,或者在编译时由于歧义而被调用。更糟糕的是,有些人会在某些编译器或选项上出错,而不是其他编译器或选项。例如,C++17添加了std::size,这可能与名为size的现有变量冲突。对某人做的坏事用户4581301 我想使用PrintMeFirst.hpp、PrintMeFirst.cpp和lab1_maketest.cpp编译一个可执行文件lab1_maketest。我使用PrintMeFirst.hpp声明PrintMeFirst函数,然后使用PrintMeFirst.cpp定义该函数,并在lab1_maketest.cpp中包含PrintMeFirst.hpp,并在lab1_maketest.cpp中调用PrintMeFirst函数。我在运行make时出错 架构的未定义符号架构x86_64的未定义符号: “PrintMeFirst(标准::基本字符串,标准::基本字符串)”,引用自: _lab1_maketest.o中的主管道 ld:找不到架构x86_64的符号 PrintMeFirst函数的链接方式或创建方式似乎有问题。不过,我看不出有什么问题。如果我不尝试链接这些文件,而是将PrintMeFirst函数放入lab1_maketest.cpp并编译它,那么我就没有问题了。这就是为什么我认为它的连接方式有问题 <>我尝试搜索错误信息,发现了几百个结果,但是我是一个初学者,当涉及编译多个C++文件(一般编码)时,不能在这个站点上执行很多答案。这个网站上的很多答案都提到了编译方法中的错误,但是我的老师给了我一个makefile供我使用,所以我认为我不应该在makefile中遇到问题 下面是我试图链接的3个文件的代码,以及我正在使用的makefileMakefile 如何修复C++;链接器错误:架构的未定义符号?,makefile,Makefile,user4581301和Ted Lyngmo还帮助指出了另一个陷阱: Rational for Ted的评论:现在每个包含该头的人都强制使用名称空间std:了,如果他们的代码还没有准备好,他们可能会在运行时得到神秘的错误,因为某些std::-homing函数被调用来代替非std::函数,或者在编译时由于歧义而被调用。更糟糕的是,有些人会在某些编译器或选项上出错,而不是其他编译器或选项。例如,C++17添加了std::size,这可能与名为size的现有变量冲突。对某人做的坏事用户4581301
// PrintMeFirst.hpp
#ifndef PrintMeFirst_hpp
#define PrintMeFirst_hpp
#include <string>
#include <stdio.h>
using namespace std;
void PrintMeFirst( string Name, string CourseInfo);
#endif
如果有人愿意,我也可以发布实际工作的整个cpp。问题在于目标
lab1\u maketest
未在您的makefile中定义:
替换:
vectorstructTax: lab1_maketest.o PrintMeFirst.o
作者:
另外,检查所有名称:在PrintMeFirst
之间输入一些拼写错误,而不是print\me\u first
最后,调用一些未定义/未声明的函数:
question(); // This does not exist
conversion(...); // this does not exist neither
最终结果:
生成文件
#
#
CC=g++
#
#CFLAGS = -c -Wall -I/usr/include/mysql
#LFLAGS = -L/usr/lib/mysql -lmysqlclient
CFLAGS = -c -Wall
LFLAGS =
all: lab1_maketest
lab1_maketest: lab1_maketest.o print_me_first.o
$(CC) lab1_maketest.o print_me_first.o -o lab1_maketest $(LFLAGS)
lab1_maketest.o: lab1_maketest.cpp
$(CC) $(CFLAGS) lab1_maketest.cpp
PrintMeFirst.o: print_me_first.cpp
$(CC) $(CFLAGS) print_me_first.cpp
clean:
rm *.o lab1_maketest
run:
./lab1_maketest
小心:makefile需要制表符,没有空格(但用空格代替)
lab1_maketest.cpp
// lab1_maketest.cpp
#include <stdio.h>
#include <iostream>
#include <iomanip>
#include <string>
#include <ctime>
#include "print_me_first.hpp"
int main() {
PrintMeFirst("My Name", "Title of assignment"); // this one is not working
}
//lab1\u maketest.cpp
#包括
#包括
#包括
#包括
#包括
#包括“print\u me\u first.hpp”
int main(){
PrintMeFirst(“我的名字”、“任务名称”);//这个不起作用
}
print_me_first.hpp和print_me_first.cpp保持不变。打字:
\35;包括“PrintMeFirst.hpp”
与print_me_first.hpp不对齐。当人们尝试构建和运行时,发现它无法编译,一些人会跳到上面说,“一旦我修复了它,它就完美了。”如果他们走得那么远。使示例100%可重复,无需修改,结果通常会更好。同上问题
和转换
。如果示例中不需要它们,请删除它们。如果您确实需要它们,请找出原因。无关:永远不要使用命名空间std头文件中的代码>。此外,不要包含超出您需要的内容<例如,PrintMeFirst.hpp
中不需要code>#include
。实际上,我在程序中的任何地方都看不到需要它。@user4581301你的眼光很敏锐,当我试图使函数名与.hpp和.cpp文件名完全匹配时,就留下了这个打字错误。无论函数名是否与文件名匹配,它都不起作用。我也犯了同样的错误。谢谢您指出。@TEDLYNGOM我将从现在开始记住这一点,对于Ted的评论,Rational:每个包含该标题的人现在都有使用名称空间std:
强制使用它们,如果他们的代码还没有准备好,那么当一些驻留在std::
中的函数被调用来代替他们的非std::
函数时,或者在编译时由于歧义性,他们可能会在运行时得到神秘的错误。更糟糕的是,有些人会在某些编译器或选项上出错,而不是其他编译器或选项。例如,C++17添加了std::size
,这可能与名为size
的现有变量冲突。对某人做的坏事。啊,老兄,非常感谢你,我很尴尬。。。真的很感激你的眼睛!欢迎@KshitijSharma。请别忘了批准答案(答案左侧的V,在分数下面;这让其他人知道问题已经回答了)。
lab1_maketest: lab1_maketest.o print_me_first.o
question(); // This does not exist
conversion(...); // this does not exist neither
#
#
CC=g++
#
#CFLAGS = -c -Wall -I/usr/include/mysql
#LFLAGS = -L/usr/lib/mysql -lmysqlclient
CFLAGS = -c -Wall
LFLAGS =
all: lab1_maketest
lab1_maketest: lab1_maketest.o print_me_first.o
$(CC) lab1_maketest.o print_me_first.o -o lab1_maketest $(LFLAGS)
lab1_maketest.o: lab1_maketest.cpp
$(CC) $(CFLAGS) lab1_maketest.cpp
PrintMeFirst.o: print_me_first.cpp
$(CC) $(CFLAGS) print_me_first.cpp
clean:
rm *.o lab1_maketest
run:
./lab1_maketest
// lab1_maketest.cpp
#include <stdio.h>
#include <iostream>
#include <iomanip>
#include <string>
#include <ctime>
#include "print_me_first.hpp"
int main() {
PrintMeFirst("My Name", "Title of assignment"); // this one is not working
}