cmake 为目标生成程序集

nzkunb0c  于 2023-08-05  发布在  其他
关注(0)|答案(3)|浏览(135)

我正在尝试将-S传递给GCC,用于我的一个可执行文件。我试过这个:

set_target_properties(MyTarget PROPERTIES COMPILE_FLAGS "-S")

字符串
但我得到“文件格式不识别;作为链接器脚本处理”
(It没有那条线也能建得很好)
像这样传递-S有什么问题吗?或者有没有其他方法让CMake输出程序集的.s文件?

bqucvtff

bqucvtff1#

CMake为汇编器和预处理器输出都内置了目标。对于一个名为src.cpp的文件,CMake为汇编程序输出生成目标src.s,为预处理器输出生成src.i。它为每个目标分别生成汇编器/预处理器输出,以防编译标志不同。使用CMake项目的make生成器,你可以得到如下的汇编器和预处理器输出:

make src.s   # assembler output
make src.i   # preprocessor output

字符串

eqoofvh9

eqoofvh92#

如果您尝试实际构建MyTarget * 并 * 保留生成的程序集,则可以将-S替换为-save-temps,然后执行make MyTarget

8mmmxcuj

8mmmxcuj3#

我想补充@ ingomueller.net的答案。CMake确实有.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}的值。在大多数情况下,这将是

<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将打印生成文件的路径,该路径将是相对于$PWDCMakeFiles/<target_name>.dir/<d2>/file.c.s
另外,请注意,您可以执行make <d2>/file.smake <d2>/file.c.s,两者都将生成文件file.c.s,但您可以在同一目录中拥有file.cfile.f90,在这种情况下,make <d2>/file.s将生成两个文件file.c.sfile.f90.s,但执行make <d2>/file.c.s将只生成一个。

相关问题