【问题标题】:Correctly setting linker flags using CMake使用 CMake 正确设置链接器标志
【发布时间】:2016-03-24 20:44:22
【问题描述】:

我有一个包含 C 和 ASM (AT&T) 源文件的项目,需要链接描述文件。我的CMakeLists.txt 看起来像这样:

cmake_minimum_required(VERSION 2.8.4)
project(proj C ASM-ATT)
file(GLOB SOURCE_FILES *.c *.S)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32 -Wall -g -fno-stack-protector -pedantic")

add_executable(proj ${SOURCE_FILES})

set_target_properties(proj PROPERTIES LINK_FLAGS "-T${proj_SOURCE_DIR}/link.ld -melf_i386")

奇怪的是,使用make VERBOSE=1 构建会显示以下内容:

[ 14%] Linking C executable proj
(...)
/usr/bin/cc -m32 -Wall -g -fno-stack-protector -pedantic  -T/path/to/link.ld -melf_i386 (all object files)
cc: error: unrecognized command line option '-melf_i386'

CMake 似乎正在尝试使用 /usr/bin/cc 作为 C 链接器。我玩过这个并尝试了几个不同的选项(包括设置CMAKE_LINKERCMAKE_EXE_LINK_OPTIONS)。

另请注意,CMakeCache.txt 包含一行内容

CMAKE_LINKER:FILEPATH=/usr/bin/ld

所以它显然知道 ld 并且只是使用 C 编译器来链接可执行文件。

任何帮助将不胜感激!

【问题讨论】:

    标签: c linker cmake


    【解决方案1】:

    默认情况下,CMake 通过编译器可执行文件间接调用链接器。链接可执行文件的模板命令设置在变量CMAKE_LANG_LINK_EXECUTABLE中。

    要让编译器将标志传递给链接器,请在设置 LINK_FLAGS 时使用 -Wl,即:

    set_target_properties(
      proj PROPERTIES LINK_FLAGS "-Wl,-T${proj_SOURCE_DIR}/link.ld,-melf_i386")
    

    【讨论】:

      猜你喜欢
      • 2016-02-25
      • 1970-01-01
      • 2021-11-02
      • 2011-04-02
      • 1970-01-01
      • 1970-01-01
      • 2020-01-28
      • 2013-06-07
      • 1970-01-01
      相关资源
      最近更新 更多