Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CMake在不同目录中添加\u自定义\u命令/\u目标以进行交叉编译_Cmake - Fatal编程技术网

CMake在不同目录中添加\u自定义\u命令/\u目标以进行交叉编译

CMake在不同目录中添加\u自定义\u命令/\u目标以进行交叉编译,cmake,Cmake,在CMake中,我试图构建一个项目,其中包括由不同工具链编译的多个不同处理器体系结构的库。对于每个体系结构,静态库构建在多个子目录中,然后收集到根目录中的共享库中。到目前为止,我还没有弄明白这一点 到目前为止,我最接近的方法是在子目录中使用add_custom_command和add_custom_target生成.a文件,然后尝试将它们收集到.a中。因此,在根目录中再次使用add_custom_command和add_custom_target。但是,如果我将.so依赖项指向自定义命令输出列表

在CMake中,我试图构建一个项目,其中包括由不同工具链编译的多个不同处理器体系结构的库。对于每个体系结构,静态库构建在多个子目录中,然后收集到根目录中的共享库中。到目前为止,我还没有弄明白这一点

到目前为止,我最接近的方法是在子目录中使用
add_custom_command
add_custom_target
生成.a文件,然后尝试将它们收集到.a中。因此,在根目录中再次使用
add_custom_command
add_custom_target
。但是,如果我将.so依赖项指向自定义命令输出列表,则生成文件会显示“无规则生成…”,因为自定义命令输出不会导出子目录。所以我尝试使.So依赖项指向子目录中的自定义目标列表,它抱怨找不到具有该名称的文件

要将其转换为代码形式,我在子目录中有以下内容:

add_custom_command(OUTPUT subout.a COMMAND ${MYAR} ...)
add_custom_target(subout_target DEPENDS subout.a)
在根目录中,我尝试了以下方法:

add_custom_command(OUTPUT my.so COMMAND ${MYLD} ... DEPENDS sub/subout.a)
add_custom_target(dll ALL DEPENDS my.so)
add_custom_command(OUTPUT my.so COMMAND ${MYLD} ... DEPENDS subout_target)
add_custom_target(dll ALL DEPENDS my.so)
我得到了“没有规则使目标'sub/subout.a',这是'my.so.Stop'所需要的。”这是有意义的,因为
add\u custom\u命令
目标不会从目录中导出

我试过这个:

add_custom_command(OUTPUT my.so COMMAND ${MYLD} ... DEPENDS sub/subout.a)
add_custom_target(dll ALL DEPENDS my.so)
add_custom_command(OUTPUT my.so COMMAND ${MYLD} ... DEPENDS subout_target)
add_custom_target(dll ALL DEPENDS my.so)
这实际上会导致生成sub/subout.a文件,但随后该文件将消失,并说“没有规则使目标'subout_target'…”

我想我真正想要的是能够模拟多个不同体系结构的
add\u库
行为。但显然,CMake不想让我这么做…:)

有什么想法吗?

我想您需要使用来定义使用定义的目标之间的依赖关系。
dependens
选项用于指定自定义规则中的文件级依赖项,但不指定目标级依赖项

例如,作为输出使用的生成
.obj
文件的命令依赖于
.cpp
文件。此外,目标可以依赖于单个文件,而不仅仅依赖于其他目标。因此,对于文件级依赖项,请使用DEPENDS选项,但要为目标级添加依赖项。

Spot On

add_dependencies允许我在add_custom_target创建的目标和add_custom_target之间创建最终的依赖关系“链接”,生成获取add_custom_命令所需的目标,以在makefile中创建真实内容,即。,我的add_custom_命令不会生成生成文件的输出,除非add_custom_命令中的输出被指定为add_custom_目标命令中的依赖项

然后,为了让add_custom_命令以正确的顺序执行,我必须使用add_custom_目标中定义的目标名称作为add_dependencies中的依赖项。注:必须在单独的引用路径中指定添加自定义\u命令添加自定义\u目标命令中指定的输出,即:

add_custom_command(OUTPUT "out1 out2 out3" ...)  # WRONG!
add_custom_target(CUSTOMTARG1 "out1 out2 out3")  # WRONG!

add_custom_command(OUTPUT "out1" "out2" "out3" ...)  # RIGHT!
add_custom_target(CUSTOMTARG1 "out1" "out2" "out3")  # RIGHT!

如果我没有将它们放在单独的带引号的路径中,那么无论它们是否存在,makefile每次都会构建输出

这完全解决了问题。非常感谢你。你帮我省了很多麻烦。make可能将“out1 out2 out3”解释为一个名称中带有空格的文件。由于您的规则不生成该文件,make将始终运行它。