在CMake中,我正在尝试构建一个项目,其中包含由不同工具链编译的多个不同处理器体系结构的库。对于每个体系结构,静态库都构建在多个子目录中,然后收集到根目录中的共享库中。到目前为止,我还没有弄清楚这一点。
我到目前为止最接近的是在子目录中使用add_custom_command
和add_custom_target
来生成.a文件,然后尝试使用{将它们收集到根目录中的.so文件中再次{1}}和add_custom_command
。但是,如果我将.so依赖项指向自定义命令输出列表,则makefile会显示“No rule to make ...”,因为自定义命令输出不会从子目录中导出。所以我尝试将.so依赖项指向子目录中的自定义目标列表,并且它抱怨它无法找到具有该名称的文件。
要把它放在代码表格中,这是我在子目录中的内容:
add_custom_target
在根目录中,我尝试了这个:
add_custom_command(OUTPUT subout.a COMMAND ${MYAR} ...)
add_custom_target(subout_target DEPENDS subout.a)
我得到“没有规则制作目标'sub / subout.a','my.so'需要。停止。”这是有道理的,因为add_custom_command(OUTPUT my.so COMMAND ${MYLD} ... DEPENDS sub/subout.a)
add_custom_target(dll ALL DEPENDS my.so)
目标不会从目录中导出。
我试过这个:
add_custom_command
这实际上会导致生成sub / subout.a文件,但随后它就会死掉,说“没有规则可以使目标'subout_target'......”
我认为我真正想要的是能够模仿多个不同架构的add_custom_command(OUTPUT my.so COMMAND ${MYLD} ... DEPENDS subout_target)
add_custom_target(dll ALL DEPENDS my.so)
行为。但显然,CMake不希望我这样做...... :)
有什么想法吗?
答案 0 :(得分:8)
我认为您需要使用add_dependencies来定义使用add_custom_target
定义的目标之间的依赖关系。 DEPENDS
选项用于指定自定义规则中的文件级依赖项,但不指定目标级依赖项。
例如,生成.obj
文件作为输出的命令使用DEPENDS来指定它取决于.cpp
文件。此外,目标可以依赖于单个文件,而不仅仅依赖于其他目标。因此,对于文件级依赖项,请使用DEPENDS选项,但使用add_dependencies作为目标级别。
答案 1 :(得分:1)
现货!
add_dependencies 允许我在 add_custom_target 创建的目标之间创建最终的依赖关系'link', add_custom_target 生成 strong所需的目标> add_custom_command 在makefile中创建真实内容,即除非 输出,否add_custom_command 在 add_custom_target 命令中被指定为依赖项。
然后为了让 add_custom_command 以正确的顺序执行,我必须使用 add_custom_target 中定义的目标名称作为 add_dependencies 即可。注意: add_custom_command 和 add_custom_target 命令中指定的 OUTPUT 必须在单独的引用路径中指定,即:
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每次都会构建输出,无论它们是否存在!