【问题标题】:CMAKE no rule to make target for internal shared libraryCMAKE 没有规则为内部共享库创建目标
【发布时间】:2015-10-19 08:17:12
【问题描述】:

我写了一个 cmake 文件,它构建了两个共享库一个 vector3.c 和一个 matrix4.c matrix4 取决于 vector3,如果我运行我的 cmake 项目并且只构建它构建的 vector3 共享库,它构建得很好,当我添加 matrix4 共享库时,我得到一个 cmake 错误。没有制定目标的规则。

文件夹结构

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})

core_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

如果我从 matrix4_scalar cmakelists.txt 文件中删除 target_link_libraries,则会收到未定义符号错误。

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

【问题讨论】:

  • 您可以删除 matrix4_scalar/CMakeLists.txt 中的 TARGET_LINK_LIBRARIES() 指令。对于共享库,创建共享库时不需要链接依赖库。
  • 我过去尝试过,但我得到未定义的符号,因为 matrix4_scalar 找不到 vector3 函数。
  • 如果您将vector3_scalar.h 直接包含在matrix4_scalar.c 中,那么您需要为vector3_scalar.h 中声明的任何内容定义一些“导出前缀”。否则,liker 会尝试静态链接这些功能。因此,如果您的工具链未提供,您可以使用 CMake 生成这些“导出标头”(请参阅​​GENERATE_EXPORT_HEADER() 宏)。
  • common/common_structs.h 是定义实际结构的地方,然后 matrix4 和 vector3 都可以包含该头文件并避免循环依赖。
  • 不,没关系。我只是指在其他平台上,您必须为它来自的每个函数定义(静态链接或动态加载)。但正如 XCode 中的here 所述,您可以直接链接到动态库。您可以尝试两件事:将SET(CMAKE_MACOSX_RPATH 1) 移动到主CMakeLists.txt,因为在子目录中它没有用(请参阅here)或将SHARED 更改为STATIC

标签: c cmake shared-libraries libraries


【解决方案1】:

我已经对您的代码进行了一些测试,并且可以重现该问题。

这与在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

参考文献

【讨论】:

  • 哇,一个错字导致了这一切头痛!非常感谢您深入挖掘并帮助我解决了这个问题!
猜你喜欢
  • 2016-01-27
  • 2015-09-26
  • 2013-02-06
  • 2016-12-30
  • 1970-01-01
  • 1970-01-01
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多