我遇到了CodeBlocks IDE的链接问题。但我认为一切都应该没问题。
我想使用laslib库。它们提供了我在CodeBlocks IDE中链接的.lib文件(我通常这样做...)。然后我包含了包含.hpp的“inc”文件夹。
Atm,我做了包含外部库的最低要求。
然后,在我的“main”函数中,我已经包含了必要的文件,CodeBlocks intellisense为我提供了函数的原型(所以链接很好我猜)。
这是我的代码:
#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()'|
等等......
我没看到我做错了什么......我已经尝试过“硬”方法,在mingw相应的文件夹中复制.hpp和.lib ......
有什么想法吗?
答案 0 :(得分: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;
}
答案 1 :(得分:0)
确保构建与库相同的体系结构的代码。默认情况下,LASlib是为32位构建的,但您的编译器可能默认为64位,因此编译器不会因为不同的方法签名而将它们链接起来。
您可以尝试为64位重建LASlib,或者为32位编译自己的软件。
不幸的是,你的链接器在某种程度上隐藏了这个问题,因为方法名称是demangling。如果您可以将编译器设置为输出损坏的名称,这可能会有所帮助,因为它可以突出显示32位和64位二进制文件之间的差异。例如,解码一个受损的名称(例如,使用https://demangler.com)可以指示链接器期望返回64位指针的方法,但是库已经定义了一个具有相同名称但返回32-的方法位指针。