You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CMake构建报错:No SOURCES given to target问题排查求助

CMake构建Hi-tech编译器目标时出现"No SOURCES given to target: my_application"错误

我正在使用Hi-tech编译器结合CMake构建生成.elf文件的应用,项目包含若干.c源文件、对应.h文件及工具生成的文件。以下是我的CMake配置文件:

CMakeLists.txt

include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/main_test.cmake)
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/test/test2.cmake)

main_test.cmake

set(PROJ_NAME "Test_Project")
set(PROJ_EXECUTABLE_NAME "my_application")

add_executable(${PROJ_EXECUTABLE_NAME})

set_target_properties(${PROJ_EXECUTABLE_NAME}
    PROPERTIES
    RUNTIME_OUTPUT_DIRECTORY "${PROJ_OUTPUT_PATH}/bin"
    OUTPUT_NAME "${PROJ_EXECUTABLE_NAME}"
    SUFFIX ".elf" # extension
)

test2.cmake

set(MY_SRC_PATH "${PROJ_CMAKE_CONFIG_ROOT}/temp/testfiles.cmake")

if(EXISTS ${MY_SRC})
    set(MYSRC_LIB_NAME MYSRC)
    set(MYSRC_ASM_LIB_NAME MYSRC_ASM)
    set(MYSRC_INTERFACE_LIB_NAME MYSRC_INTERFACE)
    include(${MY_SRC})
    message(STATUS "files are included")
else()
    message(SEND_ERROR "Couldn't find config file: ${MY_SRC}")
endif()

target_link_libraries(${PROJ_EXECUTABLE_NAME} PUBLIC ${MYSRC_LIB_NAME} ${MYSRC_ASM_LIB_NAME} ${MYSRC_INTERFACE_LIB_NAME}) #link files

target_link_options(${PROJ_EXECUTABLE_NAME} PUBLIC -Wl,--whole-archive)

testfiles.cmake

include_header_all(LOCAL_INC "${MYCODE_SRC_PATH}/component/testscript/src") #.h文件引入函数
include_source_all(LOCAL_SRC "${IMMUTABLE_SRC_PATH}/component/testscript/src") #.c文件引入函数
include_assembly_all(LOCAL_ASM "${GENERATED_SRC_PATH}") #其他工具生成文件引入函数

add_library(${MYSRC_LIB_NAME} STATIC ${LOCAL_SRC})
add_library(${MYSRC_ASM_LIB_NAME} STATIC ${LOCAL_ASM})
add_library(${MYSRC_INTERFACE_LIB_NAME} INTERFACE)

target_include_directories(${MYSRC_INTERFACE_LIB_NAME} INTERFACE ${LOCAL_INC})

构建时触发错误:

No SOURCES given to target: my_application

所有路径均已正确配置,请问遗漏了什么?


解决办法

1. 修复test2.cmake中的变量名错误

你在test2.cmake里定义了变量MY_SRC_PATH,但后续判断文件存在和引入配置时误用了未定义的MY_SRC变量,这会导致testfiles.cmake完全没被加载,相关静态库也不会被创建。修改后的test2.cmake关键部分:

set(MY_SRC_PATH "${PROJ_CMAKE_CONFIG_ROOT}/temp/testfiles.cmake")

if(EXISTS ${MY_SRC_PATH})
    set(MYSRC_LIB_NAME MYSRC)
    set(MYSRC_ASM_LIB_NAME MYSRC_ASM)
    set(MYSRC_INTERFACE_LIB_NAME MYSRC_INTERFACE)
    include(${MY_SRC_PATH})
    message(STATUS "files are included")
else()
    message(SEND_ERROR "Couldn't find config file: ${MY_SRC_PATH}")
endif()

2. 为可执行目标提供至少一个源文件

CMake部分版本或Hi-tech工具链要求可执行目标必须包含至少一个源文件。如果你的项目入口逻辑已经在静态库中,可选择以下两种方式处理:

  • 方法一:添加实际入口源文件
    在main_test.cmake中修改add_executable:
    add_executable(${PROJ_EXECUTABLE_NAME} path/to/your/main.c)
    
  • 方法二:使用空源列表(CMake 3.13+支持)
    add_executable(${PROJ_EXECUTABLE_NAME} "")
    

3. 验证源文件收集是否正常

修复变量名后,可在testfiles.cmake中添加日志,确认include_source_all等函数正确收集到了源文件:

message(STATUS "Collected C sources: ${LOCAL_SRC}")
message(STATUS "Collected assembly sources: ${LOCAL_ASM}")

内容的提问来源于stack exchange,提问作者user2986042

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 15:00:01