Makefile 如何修复C++;链接器错误:架构的未定义符号?

Makefile 如何修复C++;链接器错误:架构的未定义符号?,makefile,Makefile,user4581301和Ted Lyngmo还帮助指出了另一个陷阱: Rational for Ted的评论:现在每个包含该头的人都强制使用名称空间std:了,如果他们的代码还没有准备好,他们可能会在运行时得到神秘的错误,因为某些std::-homing函数被调用来代替非std::函数,或者在编译时由于歧义而被调用。更糟糕的是,有些人会在某些编译器或选项上出错,而不是其他编译器或选项。例如,C++17添加了std::size,这可能与名为size的现有变量冲突。对某人做的坏事用户4581301

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个文件的代码,以及我正在使用的makefile

//  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
}