CMake make : *** Нет правила, чтобы сделать цель `/path/to/uthash/utarray.h ‘, которая нужна« HelloTest ». Стоп

Я пытаюсь создать смешанный код C / C ++, чтобы запустить простой тестовый код (HelloTest) как таковой:

#include  #include "cpp_header.h" extern "C" { #include "c_header.h" } using namespace std; int main(int argc, char **argv) { cout << "Hello, World!" << endl; return 0; } 

но я получаю эту очень странную ошибку:

 /Applications/CLion.app/Contents/bin/cmake/bin/cmake --build /Users/user/Library/Caches/clion10/cmake/generated/c1d0f54d/c1d0f54d/Debug --target all -- -j 2 make[2]: *** No rule to make target `/path/to/uthash/utarray.h', needed by `HelloTest'. Stop. make[1]: *** [CMakeFiles/HelloTest.dir/all] Error 2 make: *** [all] Error 2 

Теперь utarray.h является частью uthash ( http://troydhanson.github.io/uthash/ ), а опытные читатели будут знать, что это не вопрос .c/cpp missing – utarray.h не имеет один.

Файл CMake-like выглядит так

 cmake_minimum_required(VERSION 3.2) project(HelloTest) # CPP stuff find_package(CPP_PACKAGE REQUIRED) include_directories(${CPP_PACKAGE_INCLUDE_DIR}) link_directories(${CPP_PACKGE_LIB_DIR}) # C Headers set(C_ROOT_DIR "/path/to/c/library") set(C_INCLUDE_DIR ${C_ROOT_DIR}/src ${C_ROOT_DIR}/ext/mtrand ${C_ROOT_DIR}/ext/uthash/src) include_directories(${C_INCLUDE_DIR}) # C Headers & Source [we want to avoid globbing] set(C_SOURCE ${C_ROOT_DIR}/src/bnp.c ${C_ROOT_DIR}/src/bnp.h . . . ${C_ROOT_DIR}/ext/uthash/utarray.h ${C_ROOT_DIR}/ext/uthash/uthash.h ${C_ROOT_DIR}/ext/uthash/utlist.h ${C_ROOT_DIR}/ext/uthash/utstring.h) link_directories(${C_SOURCE}) set(SOURCE_FILES main.cpp) add_executable(HelloTest ${SOURCE_FILES}) target_link_libraries(HelloTest ${CPP_LIBRARIES} ${C_SOURCE}) 

Вы устанавливаете переменную C_SOURCE в список источников и заголовков, но используете ее в командах link_directories и target_link_libraries , связанных с привязкой , а не с компиляцией .

Возможно, вам нужно добавить содержимое этой переменной в SOURCE_FILES .