出现如下问题
(1)仔细看蓝色圈所示:说是 ReadStep这个函数,vs能读取他所在的 .h 文件,编译的时候却找不到他的实现文件,导致出现LNK2019问题。
原因: 在一个.h 文件中使用extern声明了 ReadStep这个函数(注意:如果你没加extern,那可能是在对应的.cpp文件中,在实现该函数时你未加类的作用域也会报该错误), 如果多个.cpp都引用了这个.h文件,编译器会在这些.cpp去寻找它的实现,如果在某个CPP中这个实现被删除了,或者注释了,或者这个cpp被删除了,那么编译器会找不到报该错,实质上大部分的LNK2019问题都是能找到声明或定义,却找不到实现。
extern std::vector<Topo_Shape*> ReadStep(std::string fileName);
我在被我删除的.cpp文件里找到了该实现,从新把他写在了另一个cpp里,错误解决
std::vector<Topo_Shape*> ReadStep(std::string fileName)
{
std::ifstream afile;
afile.open(fileName.c_str(), std::ios::out | std::ios::in);
std::ostringstream os;
os << afile.rdbuf();
std::string str = os.str();
auto shapes = Swj_ReadSTEP(str);
return shapes;
}
上图第二个错误也是蓝色宽宽里的函数未更新所致。在此记录一下错误。
!!!!!!!!!!!!
(2)顺便记录一下LNK2019无法解析外部符号的另一种可能,在一个工程里,你将某个项目运用Cmakelist编写成了动态库,另一个项目链接该动态库链接不上也会出现上述错误,
比如这里Joint_GeometryBase2d类里面的某个函数提示说连接不上,那可能是你这个类未加这个导出的宏,在Joint_GeometryBase2d前加上*__declspec(dllexport),这里我是用马赛克处的的这个宏代替了__declspec(dllexport)*,把这个类声明为导出接口,编译成动态库之后,再调用该类里函数就可以了,就可以连接上该库。