CMake ошибка: сбой команды компоновщика с кодом завершения 1 и файлами cpp .o - PullRequest
1 голос
/ 09 января 2020

Я использую CMake для компиляции небольшого проекта.

Вот что я написал в CMakeLists.txt:

cmake_minimum_required(VERSION 3.2)
set (CMAKE_CXX_STANDARD 11)
project(DAF)

find_package(OpenCV REQUIRED)


include_directories(include)
include_directories(${OpenCV_INCLUDE_DIRS} )


file(GLOB Src_Sources "src/*.cpp")
file(GLOB Test_Sources "test/*.cpp")


add_executable(executable ${Src_Sources} ${Test_Sources})

target_link_libraries( executable include ${OpenCV_LIBS} )

У меня есть две директории sr c и test. Каталог sr c содержит только файлы, содержащие функции, тогда как каталог test содержит основной файл.

Как только я использую команду cmake, а затем команду make, я получаю эту ошибку:

Scanning dependencies of target executation
[ 25%] Building CXX object CMakeFiles/executation.dir/src/image.cpp.o
[ 50%] Building CXX object CMakeFiles/executation.dir/test/starter_1.cpp.o
[ 75%] Linking CXX executable executation
ld: library not found for -linclude
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [executation] Error 1
make[1]: *** [CMakeFiles/executation.dir/all] Error 2
make: *** [all] Error 2 

Так что я нахожу странным, что она создает .cpp.o файлы. Это нормально?

А потом как исправить ошибку library not found for -linclude?

1 Ответ

2 голосов
/ 09 января 2020

Да, CMake обычно берет имя исходного файла и добавляет .o при компиляции соответствующих объектных файлов. Например, исходный файл image.cpp будет скомпилирован в image.cpp.o. Makefile, сгенерированный CMake, будет содержать уникальную цель <someSourceFileName>.o для каждого исходного файла, где <someSourceFileName> может быть .cc, .cpp, .c, et c.

Ошибка :

ld: library not found for -linclude

означает, что вы пытались связать библиотеку с именем include с исполняемым файлом. Это, вероятно, не то, что вы намерены. Похоже, что include на самом деле является вашим каталогом включений, и вы уже указали каталоги включений в вашем CMake с помощью следующей строки:

include_directories(include)

Чтобы удалить ошибку, просто извлеките include из target_link_libraries() команда, например, так:

target_link_libraries( executable ${OpenCV_LIBS} )
...