代码之家  ›  专栏  ›  技术社区  ›  user144153

架构x86\u 64的未定义符号-如何查找丢失的文件

  •  0
  • user144153  · 技术社区  · 8 年前

    我正在尝试使用ceres solver软件包。在使用自制软件安装之后,我添加了我的CmakeList。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,但无论我尝试包括什么,我似乎无法摆脱错误。有什么建议可以解决这个问题吗?

    我目前在苹果操作系统10.12.6的CLion上工作。

    解决方案后编辑

    根据PureVision的建议,我更改了我的CmakeList。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 回复  |  直到 8 年前
        1
  •  1
  •   Chris    8 年前

    在add\u可执行调用之前,移动link\u目录并包含\u目录调用。

    Link_目录和include_目录仅适用于调用这些函数后创建的目标。看见 link_directories .

    接下来,出现链接器错误的原因可能是因为您没有将要使用的库链接到目标“untitled”中。你要找的功能是 target_link_libraries

    例如:

    target_link_libraries(untitled general NameOfLibrary)
    

    您可以将更多选项应用于target\u link\u库,但您可以在链接中找到更多信息。我要注意的一点是,在target\u link\u libraries调用中没有指向库的路径,但这是假设您要查找的库是在link\u directories()调用中指定的。但是,此函数也将接受路径。

    希望这就是你想要的。

    推荐文章