我正在开发一个图像处理项目,我需要在其中定位和标记一些面部属性(即:嘴巴、鼻子、眼睛等)。我正在尝试使用 STASM-ASM 算法 ( http://www.milbo.users.sonic.net/stasm/ ),我已经在以前在 Windows 中完成的项目中使用了这种技术,并获得了非常好的结果。
尝试在 Linux 中使用此实用程序时出现问题,我按照作者提供的说明构建了对象 .o 文件。然后,我按照如何使用 g++ 创建静态库中的说明创建了一个静态库?. 然后,我将此静态库链接到我的项目并包含以下头文件:
// stasm.h
#ifndef STASM_H_
#define STASM_H_
void AsmSearchDll(int *pnlandmarks, int landmarks[], const char image_name[], const char image_data[], const int width, const int height, const int is_color, const char con f_file0[], const char conf_file1[]);
#endif
尝试构建此项目时,出现以下错误:
undefined reference to `AsmSearchDll(int*, int*, char const*, char const*, int, int, int, char const*, char const*)'
这对我来说似乎很奇怪,因为我确定头文件已正确包含。我还尝试了作者在包中包含的 .hpp 文件,并获得了相同的确切结果。这个问题类似于Trying to get stasm to work on Ubuntu 中处理的问题。但是,该帖子仍然没有最终解决方案。我希望有人能帮我解决这个问题,STASM-ASM 实用程序真的很棒,可惜它不能在 linux 中使用,因为它提供了。
我认为问题不在于类型不匹配,我在分析了对 ASMSearchDll 函数的调用及其声明后得出了这一结论。该函数调用如下:
AsmSearchDll(&nlandmarks, landmarks, image_name, img->imageData, img->width, img->height,1 /* is_color */, NULL /* conf_file0 */, NULL /* conf_file1 */);
函数定义如下:
// stasm_dll.hpp
#ifndef stasm_dll_hpp
#define stasm_dll_hpp
extern "C"
void AsmSearchDll(
int *pnlandmarks, // out: number of landmarks, 0 if can't get landmarks
int landmarks[], // out: the landmarks, caller must allocate
const char image_name[], // in: used in internal error messages, if necessary
const char image_data[], // in: image data, 3 bytes per pixel if is_color
const int width, // in: the width of the image
const int height, // in: the height of the image
const int is_color, // in: 1 if RGB image, 0 for grayscale
const char conf_file0[], // in: 1st config filename, NULL for default
const char conf_file1[]); // in: 2nd config filename, NULL for default, "" if none
#endif // stasm_dll_hpp
此外,如果我更改传递给函数的参数之一的格式,我会收到如下错误:
../src/PruebaStasm.cpp:44:155: error: invalid conversion from ‘int’ to ‘int*’ [-fpermissive]
../src/stasm_dll.hpp:6:6: error: initializing argument 1 of ‘void AsmSearchDll(int*, int*, const char*, const char*, int, int, int, const char*, const char*)’ [-fpermissive]
我使用提供的 makefile 再次编译了 .o 文件,这些 .o 文件是我按照本教程创建的共享和动态库:http ://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html
我不明白问题出在哪里。
此致,
路易斯