Неопределенные символы для архитектуры x86_64 — как найти отсутствующие файлы

Я пытаюсь использовать пакет 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, но, что бы я ни пытался, в том числе и не могу избавиться от ошибки. Любые предложения о том, как решить эту проблему?

В настоящее время я работаю в CLion для Mac на OS 10.12.6.

Редактировать сообщение

В соответствии с рекомендациями 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})

0

Решение

Переместите вызовы link_directories и include_directories перед вызовом add_executable.

Link_directories и include_directories применяются только к целям, созданным после вызова этих функций. Увидеть link_directories.

Далее, причина, по которой вы получаете ошибку компоновщика, возможно, связана с тем, что вы не связали библиотеку, которую вы пытаетесь использовать, с вашей целью «без названия». Функция, которую вы ищете target_link_libraries.

Примером является:

target_link_libraries(untitled general NameOfLibrary)

Есть еще много опций, которые вы можете применить к target_link_libraries, но вы можете найти больше информации внутри ссылки. Замечу одно: у меня нет пути к библиотеке внутри вызова target_link_libraries, но это при условии, что нужная библиотека указана в вызове link_directories (). Однако эта функция также принимает пути.

Надеюсь, это то, что вы ищете.

1

Другие решения

Других решений пока нет …