【发布时间】:2013-05-16 12:57:06
【问题描述】:
现在我的toolchain.cmake 看起来像这样:
CMAKE_FORCE_C_COMPILER(arm-none-eabi-gcc GNU)
CMAKE_FORCE_CXX_COMPILER(arm-none-eabi-gcc GNU)
SET(CMAKE_ASM_COMPILER arm-none-eabi-as)
SET(CMAKE_OBJCOPY arm-none-eabi-objcopy CACHE INTERNAL "objcopy" FORCE)
SET(CMAKE_OBJDUMP arm-none-eabi-objdump CACHE INTERNAL "objdump" FORCE)
# Compiler Flags
SET(MCU_FLAGS "-mcpu=cortex-m3 -mthumb")
SET(CMAKE_BUILD_FLAGS "-O2 -g -mfpu=vfp -mfloat-abi=soft -Wa,-meabi=5 -ffunction-sections -fno-common -pedantic -Wall -Wextra -Wno-missing-field-initializers")
SET(CMAKE_C_FLAGS "${MCU_FLAGS} ${CMAKE_BUILD_FLAGS}" CACHE INTERNAL "c compiler flags")
SET(CMAKE_CXX_FLAGS ${CMAKE_C_FLAGS} CACHE INTERNAL "cxx compiler flags")
SET(CMAKE_ASM_FLAGS "-g -mcpu=cortex-m3 -mthumb -mfpu=vfp -mfloat-abi=soft -meabi=5 -warn" CACHE INTERNAL "asm compiler flags")
SET(CMAKE_EXE_LINKER_FLAGS "-mcpu=cortex-m3 -mthumb -Wall -Wextra -Wno-missing-field-initializers -g -nostartfiles -Wl,-T1.ld,-M=1.map,--gc-sections" CACHE INTERNAL "exe link flags")
问题是 CMake 还向链接器传递了编译器标志!有没有办法把这两者分开?
另一件事是,如果我使用另一个编译器工具链(如 Fujitsu Softtune),我如何明确告诉 CMake 采用链接器而不是编译器来链接对象?
谢谢
所以我终于解决了。对于遇到同样问题的其他人,我将 CMakelists 更改如下:
add_executable(${PROJECT_NAME} ${PROJECT_SOURCES})
SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES LINKER_LANGUAGE C CXX ASM)
SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES LINK_FLAGS "${LD_FLAGS_STR} -m ${PROJECT_NAME}.map")
set(CMAKE_C_LINK_EXECUTABLE "FLNK907S.EXE -o <TARGET> <LINK_FLAGS> <OBJECTS>")
而且效果很好……
其中${LD_FLAGS_STR} 只是我的链接器标志(自己的变量)的列表。 LNK907S.EXE 是我正在使用的链接器的名称(富士通)。
【问题讨论】:
-
这里的答案似乎需要项目特定的设置。我有同样的一般问题,我不想在我尝试构建的十几个库和二进制文件中重复这些设置。
-
嗨,我投了赞成票。我面临着同样的问题。我唯一的问题是,您有项目特定的设置。如果您可以发布 ${LD_FLAGS_STR} 是什么以及
是什么,那就太好了。因为我还想减少/删除代码中未使用的部分