如何修复c++链接器错误:未定义的体系结构符号?



user4581301和Ted Lyngmo也帮助指出了另一个陷阱:

Rational for Ted的评论:每个包含该头文件的人现在都被迫使用命名空间std:,如果他们的代码没有准备好,他们可能会在运行时,当一些std::-的函数被调用代替他们的非std::函数时,或者在编译时由于歧义而得到神秘的错误。更糟糕的是,有些人在使用某些编译器或选项时会出现错误,而其他编译器或选项则不会。例如,c++ 17增加了std::size,这可能与现有的名为size的变量冲突。对别人做的龌龊的事。——user4581301

我想用PrintMeFirst.hpp、PrintMeFirst.cpp和lab1_maketest.cpp编译一个可执行文件lab1_maketest。我使用PrintMeFirst.hpp来声明PrintMeFirst函数,然后PrintMeFirst.cpp来定义该函数,并在lab1_maketest.cpp中包括PrintMeFirst.hpp,并在lab1_maketest.cpp中调用PrintMeFirst函数。当运行make

时,我得到一个错误

for architecture的未定义符号PrintMeFirst(std::__1::basic_string<char,>, std::__1::basic_string<char,>)",引用自:_main in lab1_maketest.o架构x86_64

未找到Ld: symbol(s)

我的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
//  print_me_first.cpp
#include <iostream>
#include <string>
#include <iomanip>
#include <ctime>
#include "PrintMeFirst.hpp"
using namespace std;
void PrintMeFirst( string Name, string CourseInfo){
cout << "Program written by: " << Name << endl;
cout << "Course Info: " << CourseInfo << endl;
time_t now = time(0);
char* dt = ctime(&now);
cout << "Date: " << dt << endl;
}
//  lab1_maketest.cpp
#include <stdio.h>
#include <iostream>
#include <iomanip>
#include <string>
#include <ctime>
#include "PrintMeFirst.hpp"
int main() {
PrintMeFirst("My Name", "Title of assignment"); // this one is not working
question(); // function handled in this cpp itself
conversion(SInput, temp); // again handled within this cpp
}
// makefile
#
#
CC=g++
#
#CFLAGS = -c -Wall -I/usr/include/mysql 
#LFLAGS = -L/usr/lib/mysql -lmysqlclient
CFLAGS = -c -Wall  
LFLAGS =  

all: lab1_maketest
vectorstructTax: lab1_maketest.o PrintMeFirst.o 
$(CC) lab1_maketest.o PrintMeFirst.o  -o lab1_maketest $(LFLAGS)

lab1_maketest.o: lab1_maketest.cpp
$(CC) $(CFLAGS) lab1_maketest.cpp
PrintMeFirst.o: PrintMeFirst.cpp
$(CC) $(CFLAGS) PrintMeFirst.cpp
clean:
rm *.o lab1_maketest
run:
./lab1_maketest

如果有人想要,我也可以发布整个实际工作的cpp。

问题是目标lab1_maketest没有在您的makefile中定义:

替换:

vectorstructTax: lab1_maketest.o PrintMeFirst.o 
由:

lab1_maketest: lab1_maketest.o print_me_first.o 

同时,检查所有的名字:PrintMeFirst之间的一些错别字而不是print_me_first

最后,调用一些未定义/未声明的函数:

question(); // This does not exist
conversion(...); // this does not exist neither

最终结果:

makefile

#
#
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需要制表符,没有空格(但是stackoverflow用空格替换它们)。

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
}

print_me_first.hpp和print_me_first.cpp不变。

相关内容

  • 没有找到相关文章