【问题标题】:Undefined symbols for architecture x86_64: linking mistake?架构 x86_64 的未定义符号:链接错误?
【发布时间】:2016-04-21 14:03:27
【问题描述】:

我是cpp的新手,想要一个粒子过滤器的实现,我尝试在这里运行代码https://github.com/NewProggie/Particle-Filter,这是一个结构化且易于理解的项目。但是当我尝试编译和链接时:

g++ $(pkg-config --cflags --libs opencv)  -I/usr/local/Cellar/opencv3/3.1.0_1/include -I /usr/local/Cellar/gsl/1.16/include  -stdlib=libc++   main.cpp -o main

我有以下链接问题:

Undefined symbols for architecture x86_64:
"colorFeatures::colorFeatures()", referenced from:
  _main in main-2b4c23.o
"colorFeatures::~colorFeatures()", referenced from:
  _main in main-2b4c23.o
"adaboostDetect::detectObject(_IplImage*, CvRect**)", referenced from:
  _main in main-2b4c23.o
"adaboostDetect::adaboostDetect()", referenced from:
  _main in main-2b4c23.o
"tracker::addObjects(_IplImage*, CvRect*, int)", referenced from:
  _main in main-2b4c23.o
"tracker::initTracker(_IplImage*, CvRect*, int, int)", referenced from:
  _main in main-2b4c23.o
"tracker::showResults(_IplImage*)", referenced from:
  _main in main-2b4c23.o
"tracker::next(_IplImage*)", referenced from:
  _main in main-2b4c23.o
"tracker::tracker()", referenced from:
  _main in main-2b4c23.o
"tracker::~tracker()", referenced from:
  _main in main-2b4c23.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

有好心人对这个问题有想法吗?提前致谢

【问题讨论】:

  • 使用CMake生成makefile会更简单,因为项目提供了CMakeLists.txt
  • 尝试添加库搜索路径到opencv库g++ $(pkg-config --cflags --libs opencv) -I/usr/local/Cellar/opencv3/3.1.0_1/include -I/ usr/local/Cellar/gsl/1.16/include -L/usr/local/Cellar/opencv3/3.1.0_1/lib -stdlib=libc++ main.cpp -o main
  • @drescherjm:谢谢,但你能详细告诉我下一步该怎么做吗?我可以使用 cmake 生成 CMakeFiles 文件夹、main.app、cmake_install.cmake,但是这些东西怎么办?谢谢
  • 生成 makefile 之后。你在构建文件夹中执行makecmake --build .
  • @drescherjm,好的,非常感谢,然后使用 make 工作。但是您能否告诉我如何直接解决列出的问题(不是替代方式),欢迎任何链接或线索,感谢您的帮助和耐心

标签: c++ opencv linker clang


【解决方案1】:

已正确安装 gsl B) 向 g++ 传递对 gsl 库所在的 lib 目录的引用(可能类似于 /usr/lib 或 /usr/local/lib,这些都应该是链接器搜索的默认位置),以及 where头文件是,并且还告诉链接器进行链接。

g++ -o <name of executable> -L/path/to/gsl/libs -I/path/to/headers -lgsl <name of source file>

-L 告诉它在哪里找到库(Linux 上的 .so 文件,OS X 上的 .dylib),-I 告诉它在哪里找到头文件,-l(这是一个小写 L)告诉它链接到名为 libgsl.so 或 libgsl.dylib 的库。

首先尝试添加 -lgsl 标志,然后如果找不到 libgsl.so(或 .dylib),请添加 -L 标志。注意: /path/to/gsl/libs 和 /path/to/headers 不是你应该在其中放置的内容,而是将它们替换为系统上的实际路径。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    相关资源
    最近更新 更多