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
相关产品推荐
相关产品推荐

