未定义的引用…但一切都是联系在一起的

Undefined reference ... But all is linked

本文关键字:在一起 联系 引用 未定义      更新时间:2023-10-16

我有一个CodeBlocks IDE的链接问题。但我想一切都会好的。

我想使用laslib库。他们提供了一个我在CodeBlocks IDE中链接的.lib文件(我通常这样做…)。然后我加入了"inc"文件夹,其中包含。hpp,包括。

现在,我做了最小的要求,包括一个外部库。

然后,在我的"main"函数中,我已经包含了必要的文件,CodeBlocks智能感知为我提供了函数的原型(所以我想链接是好的)。

下面是我的代码:
#include <iostream>
#include <vector>
#include "lasreader.hpp"
#include "laswriter.hpp"
#include "lasdefinitions.hpp"
#define FILENAME "D:\las.las"
#define FILEOUT "D:\out"
int main(int argc, char** argv)
{
// Assume that's correct for simplicity @TODO : check argv
std::string filename = FILENAME;//argv[1];
std::string file_out = FILEOUT; //argv[2];
LASreadOpener lasreadopener;
LASwriteOpener laswriteopener;
lasreadopener.set_file_name(filename.c_str());
laswriteopener.set_file_name(file_out.c_str());
lasreadopener.parse(0, NULL); // parse without args
// Declare lasreader
LASreader* lasreader;
// Open the file
lasreader = lasreadopener.open();
//  Create and open the writer
LASwriter* laswriter = laswriteopener.open(&lasreader->header);
// Loop through the points (note they will already be filtered)
while (lasreader->read_point())
{
    // Show coordinates
    std::cout << lasreader->point.get_x() << ", " << lasreader->point.get_y() << ", " << lasreader->point.get_z() << std::endl;
    // Write point
    laswriter->write_point(&lasreader->point);
    // Add it to the inventory (keeps track of min/max values for the header)
    laswriter->update_inventory(&lasreader->point);
}
laswriter->update_header(&lasreader->header, TRUE);
laswriter->close();
lasreader->close();
delete laswriter;
delete lasreader;
}

错误如下:

main.cpp|17|undefined reference to `LASreadOpener::LASreadOpener()'|
main.cpp|18|undefined reference to `LASwriteOpener::LASwriteOpener()'|

等等……

我不知道我做错了什么…我已经尝试了"硬"的方法,将。hpp和。lib复制到mingw相应的文件夹中…

任何想法?

文件结构如下:

./LAStools
./myproject

./myproject我编译如下:

g++ main.cpp -I../LAStools/LASlib/inc/ -I../LAStools/LASzip/src -llas -L.

这导致了代码的无错误编译:

#include "lasreader.hpp"
#include "laswriter.hpp"
int main(int argc, char *argv[]){
  LASreadOpener lasreadopener;
  lasreadopener.set_file_name("original.las");
  LASreader* lasreader = lasreadopener.open();
  while (lasreader->read_point()) {}
  lasreader->close();
  delete lasreader;
  return 0;
}

确保为与库相同的体系结构构建代码。默认情况下,LASlib是为32位构建的,但你的编译器可能默认为64位,所以编译器不会链接它们,因为不同的方法签名。

你可以尝试重新构建64位的LASlib,或者为32位编译你自己的软件。

不幸的是,你的链接器在某种程度上隐藏了这个问题,因为它混淆了方法名。如果您可以将编译器设置为输出混乱的名称,这可能会有所帮助,因为它可以突出显示32位和64位二进制文件之间的差异。例如,解码一个混乱的名称(例如使用https://demangler.com)可以指示链接器期望一个返回64位指针的方法,但库已经定义了一个具有相同名称但返回32位指针的方法。