g++ ld: 找不到 x86_64 架构的符号。

59

我正在尝试编译Sam Hare的Struck代码

我使用的是macOSX10.9、opencv2.4.6和Eigen2.0.17。

Eigen和opencv的头文件存储在/opt/local/include中,而opencv dylib存储在/opt/local/lib中。

我修改了Hare的Makefile以适应这个文件夹。当我在终端上输入make时:

g++ -L/opt/local/lib -lopencv_core -lopencv_highgui -lopencv_imgproc src/Config.o src/Features.o src/HaarFeature.o src/HaarFeatures.o src/HistogramFeatures.o src/ImageRep.o src/LaRank.o src/MultiFeatures.o src/RawFeatures.o src/Sampler.o src/Tracker.o src/main.o src/GraphUtils/GraphUtils.o -o struck

我遇到了以下错误:

Undefined symbols for architecture x86_64:  
"cv::namedWindow(std::__1::basic_string<char,
std::__1::char_traits<char>, std::__1::allocator<char> > const&,
int)", referenced from:
      _main in main.o   "cv::split(cv::Mat const&, std::__1::vector<cv::Mat, std::__1::allocator<cv::Mat> >&)",
referenced from:
      ImageRep::ImageRep(cv::Mat const&, bool, bool, bool) in ImageRep.o   "cv::imread(std::__1::basic_string<char,
std::__1::char_traits<char>, std::__1::allocator<char> > const&,
int)", referenced from:
      _main in main.o   "cv::imshow(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&,
cv::_InputArray const&)", referenced from:
      LaRank::Debug() in LaRank.o
      Tracker::Debug() in Tracker.o
      _main in main.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see
invocation)

有什么想法吗?谢谢!


您的32位和64位库之间存在冲突。 - klm123
好的,实际上我不知道怎么解决。有提示吗? - mbPro
1
你需要检查所有链接在一起的库,无论它们是32位还是64位。如果你不确定它们来自哪里,我不知道该怎么做。 - klm123
5个回答

47

当我试图从两个不同的目标文件(main.o和add.o)中创建可执行文件时,我遇到了类似的警告/错误/故障。我使用了以下命令:

gcc -o exec main.o add.o

但我的程序是一个C++程序。使用g++编译器解决了我的问题:

g++ -o exec main.o add.o

我一直以为gcc可以自行解决这些问题。显然并非如此。希望这可以帮助其他搜索这个错误的人。


我也是这样认为的:“我一直以为gcc可以自己解决这些问题。” - Rastikan

9

终于解决了我的问题。

我在XCode中创建了一个新项目并将C++标准库从默认的libc++更改为libstdc++,方法如这里这里所述。


1
在我的情况下,将 'libc++.dylib' 添加到框架中解决了这个问题。希望能帮助到某些人。 - Sandeep

3

当我使用 clang 编译 C++ 程序时,我遇到了类似的错误。

但是当我改用 chang++ 时,编译工作正常了。


这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - Nejc Galof

1

我遇到了同样的错误。我认为这并不是一个“修复”方法,但我的解决办法是同时包含cpp文件。因此,不仅仅是把

#include "MyClass.h"

我必须放置

#include "MyClass.h"
#include "MyClass.cpp"

0

我在.h文件中编写了我的声明。

class String
{
    String (const char * cstr = 0);
}; 

我在另一个.cpp文件(实现)中使用了内联函数

inline String::String(const char * cstr)
{
//code ... 
}

然后我使用g++,得到这个: 对架构x86_64未定义的符号: “String :: String(char const *)”,引用自: test-d389f3.o中的_main ld:找不到架构x86_64的符号(s)
解决方案:在声明和实现独立时不要编写inline

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接