2015-10-19 3 views
0

Я написал файл cmake, который строит две общие библиотеки: vector3.c и matrix4.c Матрица4 зависит от vector3, если я запускаю проект cmake и создаю vector3, он строит просто отлично, когда я добавляю библиотеку с разделителем matrix4, я получаю ошибку cmake. Никакого правила, чтобы сделать цель.CMAKE no rule to make target для внутренней общей библиотеки

Структура папки

core_math 
------CMakeLists.txt 
-common/ 
------common_structs.h 
-matrix4/ 
------CMakeLists.txt 
------matrix4/src/matrix4_scalar.c 
------matrix4/headers/matrix4_scalar.h 
-vector3/ 
-------CMakeLists.txt 
-------vector3/src/vector3_scalar.c 
-------vector3/headers/vector3_scalar.h 

core_math/CMakeLists.txt

PROJECT(core_math) 
CMAKE_MINIMUM_REQUIRED(VERSION 2.8) 

ADD_SUBDIRECTORY(vector3_scalar) 
ADD_SUBDIRECTORY(matrix4_scalar) 
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY $(CMAKE_BINARY_DIR)/static_lib) 
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY $(CMAKE_BINARY_DIR)/shared_lib) 
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY $(CMAKE_BINARY_DIR)/bin) 

SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules) 

core_math/Vector3/CMakeLists.txt

PROJECT(vector3_scalar) 
SET(CMAKE_MACOSX_RPATH 1) 

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../common) 

SET(HEADER_FILES ${CMAKE_CURRENT_SOURCE_DIR}/../common/common_structs.h) 
SET(SRC_FILES ${CMAKE_CURRENT_SOURCE_DIR}/src/vector3_scalar.c ${HEADER_FILES}) 

ADD_LIBRARY(vector3_scalar SHARED ${SRC_FILES}) 

ядро _math/matrix4_scalar/CMakeLists.txt

PROJECT(matrix4_scalar) 
SET(CMAKE_MACOSX_RPATH 1) 

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../common 
    ${CMAKE_CURRENT_SOURCE_DIR}/../vector3_scalar) 


SET(HEADER_FILES ${CMAKE_CURRENT_SOURCE_DIR}/../common/common_structs.h 
    ${CMAKE_CURRENT_SOURCE_DIR}/../vector3_scalar/headers/vector3_scalar.h 
    ${CMAKE_CURRENT_SOURCE_DIR}/headers/matrix4_scalar.h) 
SET(SRC_FILES ${CMAKE_CURRENT_SOURCE_DIR}/src/matrix4_scalar.c ${HEADER_FILES}) 

ADD_LIBRARY(matrix4_scalar SHARED ${SRC_FILES}) 

TARGET_LINK_LIBRARIES(matrix4_scalar vector3_scalar) 

ошибка сборки

-- Build files have been written to: /Users/blubee/MATH/project/build 
Scanning dependencies of target vector3_scalar 
[ 25%] Building C object source/core_math/vector3_scalar/CMakeFiles/vector3_scalar.dir/sr 
c/vector3_scalar.c.o 
[ 50%] Linking C shared library $(CMAKE_BINARY_DIR)/lib/libvector3_scalar.dylib 
[ 50%] Built target vector3_scalar 
Scanning dependencies of target matrix4_scalar 
[ 75%] Building C object source/core_math/matrix4_scalar/CMakeFiles/matrix4_scalar.dir/sr 
c/matrix4_scalar.c.o 
make[2]: *** No rule to make target `source/core_math/vector3_scalar//Users/blubee/MATH/pr 
oject/build/lib/libvector3_scalar.dylib', needed by `source/core_math/matrix4_scalar//Use 
rs/blubee/MATH/project/build/lib/libmatrix4_scalar.dylib'. Stop. 
make[1]: *** [source/core_math/matrix4_scalar/CMakeFiles/matrix4_scalar.dir/all] Error 2 
make: *** [all] Error 2 

если я удалить target_link_libraries из matrix4_scalar файла CMakeLists.txt тогда я получаю неопределенные символы ошибки вместо этого.

Undefined symbols for architecture x86_64: 
    "_vec3_deg2rad", referenced from: 
     _mat4_rotate in matrix4_scalar.c.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
make[2]: *** [source/core_math/matrix4_scalar//Users/blubee/MATH/project/build/lib/libmatr 
ix4_scalar.dylib] Error 1 
make[1]: *** [source/core_math/matrix4_scalar/CMakeFiles/matrix4_scalar.dir/all] Error 2 
make: *** [all] Error 2 
+0

вы можете удалить инструкцию TARGET_LINK_LIBRARIES() в файле matrix4_scalar/CMakeLists.txt. Для общих библиотек вам не нужно связываться с зависимыми библиотеками при создании общей библиотеки. – cm161

+0

Я пробовал это в прошлом, но получаю undefined символ, так как matrix4_scalar не может найти функцию vector3. – user1610950

+0

Если вы включите 'vector3_scalar.h' непосредственно в' matrix4_scalar.c', тогда вам нужно будет иметь некоторый «префикс экспорта», определенный для того, что объявлено в 'vector3_scalar.h'. В противном случае пользователь пытается связать эти функции статически. Таким образом, вы можете сгенерировать эти «заголовки экспорта» с помощью CMake (см. Макрос ['GENERATE_EXPORT_HEADER()'] (https://cmake.org/cmake/help/v3.3/module/GenerateExportHeader.html)), если ваша toolchain не предоставлять его. – Florian

ответ

3

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

Это связано с использованием скобок $(...) для переменных разыменований в команде SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ...). Я изменил $(CMAKE_BINARY_DIR) к ${CMAKE_BINARY_DIR} и все работает отлично:

> cmake --build . 
-- Configuring done 
-- Generating done 
-- Build files have been written to: build 
Scanning dependencies of target vector3_scalar 
[ 25%] Building C object vector3_scalar/CMakeFiles/vector3_scalar.dir/src/vector3_scalar.c.o 
[ 50%] Linking C shared library ../shared_lib/libvector3_scalar.dylib 
[ 50%] Built target vector3_scalar 
Scanning dependencies of target matrix4_scalar 
[ 75%] Building C object matrix4_scalar/CMakeFiles/matrix4_scalar.dir/src/matrix4_scalar.c.o 
[100%] Linking C shared library ../shared_lib/libmatrix4_scalar.dylib 
[100%] Built target matrix4_scalar 

Ссылки

+0

ничего себе, человек опечатка вызвала всю эту головную боль! Большое спасибо за то, что вы действительно глубоко разбираетесь и помогаете мне решить эту проблему! – user1610950

Смежные вопросы