使用CMake正确设置链接器标志

时间:2016-03-24 20:44:22

标签: c linker cmake

我有一个包含C和ASM(AT& T)源文件的项目需要链接器脚本。我的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' 进行构建会显示以下内容:

/usr/bin/cc

似乎CMake正试图将CMAKE_LINKER用作C链接器。我玩过这个并尝试了几种不同的选项(包括设置CMAKE_EXE_LINK_OPTIONSCMakeCache.txt)。

另请注意,CMAKE_LINKER:FILEPATH=/usr/bin/ld 包含一行

ld

所以它显然知道''' Equations corresponding to various labels a -> 2+x[n] b -> 3*x[n-1]+2x[n] c -> 4*x[n] These are just dummy equations I am making up for the example ''' x = [4,7,6,6,9,12,4,9,1,11] labelArray = ['a','b','b','b','c','c','a','b','b','c'] outputArray = [] n = 0 for label in labelArray: if label == 'a': output = 2+x[n] elif label == 'b': output = 3*x[n-1]+2*x[n] elif label == 'c': output = 4*x[n] outputArray.append(output) n += 1 print outputArray # outputArray = [6, 26, 33, 30, 36, 48, 6, 30, 29, 44] 并且只是使用C编译器链接可执行文件。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

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

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

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