cmake构建时加入第三方库需要构建两次才能成功

文章描述了在使用CMake构建项目时遇到的问题,即首次构建因未明确库依赖导致失败。解决方案是通过`ADD_SUBDIRECTORY`添加libyuv子目录,并使用`TARGET_LINK_LIBRARIES`指定库目标名称`yuv`,而非直接链接库文件,确保构建顺序正确,避免并行构建冲突。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在使用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将不再尝试并行地构建它们,这时候进行构建则一次成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值