在使用cmake构建项目时,因为用到了libyuv,于是开始使用了以下的构建方式
ADD_SUBDIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/libyuv ${CMAKE_CURRENT_BINARY_DIR}/libyuv)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/libyuv/include)
FILE(COPY ${CMAKE_CURRENT_SOURCE_DIR}/libyuv/include DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/libyuv)
SET(LIBYUV_LIBS ${CMAKE_CURRENT_BINARY_DIR}/libyuv/libyuv.a)
ADD_EXECUTABLE(${PROJECT_NAME} main.cpp)
TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIBYUV_LIBS})
然后进行构建
mkdir -p build
cd build
cmake ..
make -j
但是构建时第一次构建失败,需要再构建一次才能成功。后来经过查找资料,发现这样写cmake不知道项目和libyuv是依赖关系,没有按照顺序先生成libyuv.a
,再将其链接到项目。因此,正确且简单的解决方法是,添加库文件的搜索路径,使用与库链接使用库目标名称,而不是直接库文件。修改后的CMakeLists如下:
ADD_SUBDIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/libyuv ${CMAKE_CURRENT_BINARY_DIR}/libyuv)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/libyuv/include)
FILE(COPY ${CMAKE_CURRENT_SOURCE_DIR}/libyuv/include DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/libyuv)
LINK_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/libyuv)
ADD_EXECUTABLE(${PROJECT_NAME} main.cpp)
TARGET_LINK_LIBRARIES(${PROJECT_NAME} yuv)
现在表明了项目和libyuv
之间的依赖关系,因此make -j
将不再尝试并行地构建它们,这时候进行构建则一次成功。