如何通过CMake FetchContent构建需configure/make的ta-lib依赖?
解决CMake FetchContent构建ta-lib的问题
问题根源
- 原配置中
CONFIGURE_COMMAND仅写configure,既未明确脚本路径,也未指定安装前缀,导致构建流程未正确触发或安装位置不符合预期 - ta-lib是非CMake项目,FetchContent不会自动生成
ta_lib导入目标,直接调用链接会找不到库 BUILD_IN_SOURCE TRUE与FetchContent自动生成的BINARY_DIR冲突,触发报错
正确配置代码
修改CMakeLists.txt中的FetchContent配置如下:
FetchContent_Declare(ta_lib DOWNLOAD_DIR /tmp URL http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz CONFIGURE_COMMAND <SOURCE_DIR>/configure --prefix=<INSTALL_DIR> BUILD_COMMAND make -j$(nproc) INSTALL_COMMAND make install BUILD_IN_SOURCE TRUE ) FetchContent_MakeAvailable(ta_lib) # 手动创建导入库目标 add_library(ta_lib STATIC IMPORTED GLOBAL) set_target_properties(ta_lib PROPERTIES IMPORTED_LOCATION "${ta_lib_INSTALL_DIR}/lib/libta_lib.a" INTERFACE_INCLUDE_DIRECTORIES "${ta_lib_INSTALL_DIR}/include" ) # 链接到你的项目 target_link_libraries(${PROJECT_NAME} PRIVATE ta_lib)
关键修改说明
CONFIGURE_COMMAND:明确调用源目录下的configure脚本,通过--prefix=<INSTALL_DIR>指定安装到FetchContent管理的本地目录,避免污染系统环境BUILD_IN_SOURCE TRUE:让构建流程在源目录执行,配合CONFIGURE_COMMAND的路径设置,可规避与FetchContent默认BINARY_DIR的冲突- 手动创建导入目标:由于ta-lib不是CMake项目,FetchContent不会自动生成导入库目标,需通过
add_library(IMPORTED)手动创建,同时指定库文件路径和头文件目录 - 并行构建:
make -j$(nproc)利用多核加速构建,可根据实际硬件调整参数
兼容替代写法
如果BUILD_IN_SOURCE TRUE仍有冲突,可改用显式指定工作目录的方式:
FetchContent_Declare(ta_lib DOWNLOAD_DIR /tmp URL http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz CONFIGURE_COMMAND cd <SOURCE_DIR> && ./configure --prefix=<INSTALL_DIR> BUILD_COMMAND cd <SOURCE_DIR> && make -j$(nproc) INSTALL_COMMAND cd <SOURCE_DIR> && make install ) FetchContent_MakeAvailable(ta_lib) # 手动创建导入目标 add_library(ta_lib STATIC IMPORTED GLOBAL) set_target_properties(ta_lib PROPERTIES IMPORTED_LOCATION "${ta_lib_INSTALL_DIR}/lib/libta_lib.a" INTERFACE_INCLUDE_DIRECTORIES "${ta_lib_INSTALL_DIR}/include" ) target_link_libraries(${PROJECT_NAME} PRIVATE ta_lib)
内容的提问来源于stack exchange,提问作者marital_weeping
相关产品推荐
相关产品推荐

