我正在尝试将-S传递给GCC,用于我的一个可执行文件。我试过这个:
-S
set_target_properties(MyTarget PROPERTIES COMPILE_FLAGS "-S")
字符串但我得到“文件格式不识别;作为链接器脚本处理”(It没有那条线也能建得很好)像这样传递-S有什么问题吗?或者有没有其他方法让CMake输出程序集的.s文件?
bqucvtff1#
CMake为汇编器和预处理器输出都内置了目标。对于一个名为src.cpp的文件,CMake为汇编程序输出生成目标src.s,为预处理器输出生成src.i。它为每个目标分别生成汇编器/预处理器输出,以防编译标志不同。使用CMake项目的make生成器,你可以得到如下的汇编器和预处理器输出:
src.cpp
src.s
src.i
make src.s # assembler output make src.i # preprocessor output
字符串
eqoofvh92#
如果您尝试实际构建MyTarget * 并 * 保留生成的程序集,则可以将-S替换为-save-temps,然后执行make MyTarget
MyTarget
-save-temps
make MyTarget
8mmmxcuj3#
我想补充@ ingomueller.net的答案。CMake确实有.s目标,但对于多目录项目,您必须导航到构建目录中的正确目录才能获得它。该目录由创建目标的CMakeLists.txt文件的位置和访问它的add_subdirectory()命令确定。如果
.s
CMakeLists.txt
add_subdirectory()
<source_dir>/<d1>/CMakeLists.txt
字符串有
add_excutable(x <d2>/file.c) #or add_library(x <d2>/file.c)
型然后,如果您先转到正确的目录,就可以运行make <d2>/file.s。通常,这将是创建目标的${CMAKE_CURRENT_BINARY_DIR}的值。在大多数情况下,这将是
make <d2>/file.s
${CMAKE_CURRENT_BINARY_DIR}
<build_dir>/<d1>
型但这可能是不同的,因为add_subdirectory()可以接受两个参数,这可以改变事情。例如,假设<d1>是a/b,如果顶级CMakeLists.txt是add_subdirectory(a/b/ c),那么您将需要转到<build_dir>/c。add_subdirectory的第二个参数也可以是绝对路径。由于我们可以通过多个add_subdirectory()命令来访问创建目标的CMakeLists.txt文件,因此唯一的一般答案是“无论${CMAKE_CURRENT_BINARY_DIR}的值是什么,目标都是在哪里创建的”。CMake将打印生成文件的路径,该路径将是相对于$PWD的CMakeFiles/<target_name>.dir/<d2>/file.c.s。另外,请注意,您可以执行make <d2>/file.s或make <d2>/file.c.s,两者都将生成文件file.c.s,但您可以在同一目录中拥有file.c和file.f90,在这种情况下,make <d2>/file.s将生成两个文件file.c.s和file.f90.s,但执行make <d2>/file.c.s将只生成一个。
<d1>
a/b
add_subdirectory(a/b/ c)
<build_dir>/c
$PWD
CMakeFiles/<target_name>.dir/<d2>/file.c.s
make <d2>/file.c.s
file.c.s
file.c
file.f90
file.f90.s
3条答案
按热度按时间bqucvtff1#
CMake为汇编器和预处理器输出都内置了目标。对于一个名为
src.cpp
的文件,CMake为汇编程序输出生成目标src.s
,为预处理器输出生成src.i
。它为每个目标分别生成汇编器/预处理器输出,以防编译标志不同。使用CMake项目的make生成器,你可以得到如下的汇编器和预处理器输出:字符串
eqoofvh92#
如果您尝试实际构建
MyTarget
* 并 * 保留生成的程序集,则可以将-S
替换为-save-temps
,然后执行make MyTarget
8mmmxcuj3#
我想补充@ ingomueller.net的答案。CMake确实有
.s
目标,但对于多目录项目,您必须导航到构建目录中的正确目录才能获得它。该目录由创建目标的CMakeLists.txt
文件的位置和访问它的add_subdirectory()
命令确定。如果
字符串
有
型
然后,如果您先转到正确的目录,就可以运行
make <d2>/file.s
。通常,这将是创建目标的${CMAKE_CURRENT_BINARY_DIR}
的值。在大多数情况下,这将是型
但这可能是不同的,因为
add_subdirectory()
可以接受两个参数,这可以改变事情。例如,假设<d1>
是a/b
,如果顶级CMakeLists.txt是add_subdirectory(a/b/ c)
,那么您将需要转到<build_dir>/c
。add_subdirectory的第二个参数也可以是绝对路径。由于我们可以通过多个add_subdirectory()
命令来访问创建目标的CMakeLists.txt
文件,因此唯一的一般答案是“无论${CMAKE_CURRENT_BINARY_DIR}
的值是什么,目标都是在哪里创建的”。CMake将打印生成文件的路径,该路径将是相对于
$PWD
的CMakeFiles/<target_name>.dir/<d2>/file.c.s
。另外,请注意,您可以执行
make <d2>/file.s
或make <d2>/file.c.s
,两者都将生成文件file.c.s
,但您可以在同一目录中拥有file.c
和file.f90
,在这种情况下,make <d2>/file.s
将生成两个文件file.c.s
和file.f90.s
,但执行make <d2>/file.c.s
将只生成一个。