体系结构的未定义符号 x86_64 - 如何查找丢失的文件
Undefined symbols for architecture x86_64 - how to find missing files
我正在尝试使用 ceres-solver 包。使用自制软件安装后,我添加了如下创建 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)
通过查看 Whosebug,我现在知道我可能遗漏了 CMakeLists.txt 中的某些内容,但无论我尝试包括什么,我似乎都无法摆脱错误。关于如何解决这个问题的任何建议?
我目前在 CLion 工作 Mac OS 10.12.6.
Post 解决方案编辑
根据 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})
将 link_directories 和 include_directories 电话移到 add_executable 电话之前。
Link_directories 和 include_directories 仅适用于调用这些函数后创建的目标。参见 link_directories。
接下来,您收到 linker 错误的原因可能是您尚未 link 编辑您尝试在目标中使用的库 "untitled"。您要查找的函数是 target_link_libraries.
一个例子是:
target_link_libraries(untitled general NameOfLibrary)
您可以在 target_link_libraries 中应用更多选项,但您可以在 link 中找到更多信息。我要注意的一件事是,我在 target_link_libraries 调用中没有库的路径,但这是假设您要查找的库在 link_directories() 中指定称呼。但是,此函数也将接受路径。
希望这就是您要找的。
我正在尝试使用 ceres-solver 包。使用自制软件安装后,我添加了如下创建 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)
通过查看 Whosebug,我现在知道我可能遗漏了 CMakeLists.txt 中的某些内容,但无论我尝试包括什么,我似乎都无法摆脱错误。关于如何解决这个问题的任何建议?
我目前在 CLion 工作 Mac OS 10.12.6.
Post 解决方案编辑
根据 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})
将 link_directories 和 include_directories 电话移到 add_executable 电话之前。
Link_directories 和 include_directories 仅适用于调用这些函数后创建的目标。参见 link_directories。
接下来,您收到 linker 错误的原因可能是您尚未 link 编辑您尝试在目标中使用的库 "untitled"。您要查找的函数是 target_link_libraries.
一个例子是:
target_link_libraries(untitled general NameOfLibrary)
您可以在 target_link_libraries 中应用更多选项,但您可以在 link 中找到更多信息。我要注意的一件事是,我在 target_link_libraries 调用中没有库的路径,但这是假设您要查找的库在 link_directories() 中指定称呼。但是,此函数也将接受路径。
希望这就是您要找的。