3

我有 CodeBlocks IDE 的链接问题。但我认为一切都应该没问题。

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

Atm,我做了包含外部库的最低要求。

然后,在我的“主”函数中,我包含了必要的文件,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()'|

ETC ...

我没有看到我做错了什么......我已经尝试过在mingw相应文件夹中复制.hpp和.lib的“硬”方法......

有任何想法吗?

4

2 回答 2

1

我的文件结构如下:

./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;
}
于 2016-08-12T20:28:24.383 回答
0

确保您正在为与库相同的架构构建代码。默认情况下,LASlib 是为 32 位构建的,但您的编译器可能默认为 64 位,因此由于方法签名不同,编译器不会链接它们。

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

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

于 2017-06-07T00:20:52.500 回答