架构x86_64的未定义符号 - 如何查找丢失的文件

时间:2017-11-14 19:13:01

标签: c++ cmake linker-errors ceres-solver

我正在尝试使用ceres-solver软件包。使用home-brew安装后,我添加了如下创建的CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.8)
project(myproject)

set(CMAKE_CXX_STANDARD 11)

set(SOURCE_FILES main.cpp)
add_executable(untitled ${SOURCE_FILES})

# add extra include directories
include_directories(/usr/local/include)
include_directories(/usr/local/include/eigen3)

# add extra lib directories
link_directories(/usr/local/lib)

但是,当我尝试使用Ceres包时,我收到链接错误。作为一个非常简单的测试用例,我使用以下代码:

#include "ceres.h"

int main(int argc, char** argv) {
    ceres::Problem problem;
    return 0;
}

会引发以下错误:

Undefined symbols for architecture x86_64:
  "ceres::Problem::Problem()", referenced from:
      _main in main.cpp.o
  "ceres::Problem::~Problem()", referenced from:
      _main in main.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

从浏览stackoverflow,我现在知道我可能会错过CMakeLists.txt中的内容,但无论我尝试包括什么,我似乎都无法摆脱错误。关于如何解决这个问题的任何建议?

我目前在OS 10.12.6上使用CLion for Mac。

解决方案后编辑

根据PureVision的建议,我将我的CMakeLists.txt更改为以下内容并且一切都很好

cmake_minimum_required(VERSION 3.8)
project(myproject)

set(CMAKE_CXX_STANDARD 11)

set(SOURCE_FILES main.cpp)

# add extra include directories
include_directories(/usr/local/include)
include_directories(/usr/local/include/eigen3)

# add extra lib directories
link_directories(/usr/local/lib)

link_libraries(glog)
link_libraries(ceres)

add_executable(myproject ${SOURCE_FILES})

1 个答案:

答案 0 :(得分:1)

在add_executable调用之前移动link_directories和include_directories调用。

Link_directories和include_directories仅适用于调用这些函数后创建的目标。请参阅link_directories

接下来,您收到链接器错误的原因可能是因为您没有将您尝试使用的库链接到目标"无标题"。您正在寻找的功能是target_link_libraries

一个例子是:

target_link_libraries(untitled general NameOfLibrary)

您可以将更多选项应用于target_link_libraries,但您可以在链接中找到更多信息。我要注意的一件事是,我没有在target_link_libraries调用中有一个指向库的路径,但是假设你正在寻找的库是在link_directories()中指定的。呼叫。此函数也会接受路径。

希望这是你正在寻找的。