我正在尝试遵循here从CMake中调用现有Makefile(构建静态库)的方法。
我的情况如下
project/makefile_lib
cmake_lib
)取决于目录makefile_lib
中的project
cmake_lib
project
的可执行文件
CMakeLists.txt
中的project
内容如下所示。
project(cmake_makefile)
cmake_minimum_required(VERSION 2.8.12)
add_subdirectory(makefile_lib)
add_library(cmake_lib cmake_lib.c)
target_include_directories(cmake_lib
PRIVATE makefile_lib
)
target_link_libraries(cmake_lib makefile_lib)
add_executable(main main.c)
target_link_libraries(main cmake_lib)
CMakeLists.txt
project/makefile_lib
add_custom_target(build_makefile_lib
ALL
COMMAND ${CMAKE_MAKE_PROGRAM}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMMENT "makefile_lib makefile"
)
add_library(makefile_lib STATIC IMPORTED)
set_target_properties(makefile_lib
PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/libmakefile_lib.a
)
add_dependencies(makefile_lib build_makefile_lib)
根据add_dependencies
文档:
添加到IMPORTED目标的依赖关系会在其位置传递,因为目标本身不会构建。
从我调用的project
目录
mkdir build
cd build/
cmake ..
make
但是project/makefile_lib
中的Makefile永远不会被调用,并且构建会因cannot find -lmakefile-lib
而失败。
有趣的是,如果我将project/makefile_lib
的内容移动到project
并将顶级add_subdirectory
中的CMakeLists.txt
命令替换为{{project/makefile_lib/CMakeLists.txt
的内容,则此方法有效1}}。
为什么这个案例中的add_dependencies
命令似乎没有传递过来?
答案 0 :(得分:1)
问题在于add_library
命令。从文档
目标名称在创建它的目录中具有范围 下面,但GLOBAL选项扩展了可见性。
所以解决方案是将GLOBAL
选项添加到add_library
project/makefile_lib/CMakeLists.txt
命令
add_custom_target(build_makefile_lib
ALL
COMMAND ${CMAKE_MAKE_PROGRAM}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMMENT "makefile_lib makefile"
)
add_library(makefile_lib STATIC IMPORTED GLOBAL)
set_target_properties(makefile_lib
PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/libmakefile_lib.a
)
add_dependencies(makefile_lib build_makefile_lib)
编辑:请注意,这不适用于CMake版本< = 2.8.7,其中GLOBAL
标志尚不存在。有关可能的解决方法,请参阅here。