我想将一些对象文件添加到 CMake 静态库,但它们有自定义扩展名。
这是我尝试过的:
set(SRCS testfile.cxx jsobj.js)
add_library(testlib STATIC ${SRCS})
制作完成后,CMake 会调用ar testfile.cxx.o
(即另一个文件被完全忽略)。如何将其包含在存档中?以下是我尝试过的其他一些技巧:
list(APPEND CMAKE_CXX_SOURCE_FILE_EXTENSIONS js)
list(APPEND CMAKE_C_SOURCE_FILE_EXTENSIONS js) # no luck
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/jsobj.js.o
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/jsobj.js
${CMAKE_CURRENT_BINARY_DIR}/jsobj.js.o
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/jsobj.js.o) # still no luck
(如果你感兴趣,我正在使用 emscripten 编译器,它可以接受 C/C++ 文件作为源输入,而 JavaScript 文件本质上是“预编译对象”。我想找到一种方法让 CMake 将它们添加到这ar
命令行,仅此而已!)
根据记录,这就是我以一种黑客的方式解决我的问题的方法:“正确的”解决方案将很乐意被接受。
我为我的特殊预编译对象创建了一个新的文件扩展名“jso”,然后将其添加到 CMake 可以理解的输入文件列表中:
list(APPEND CMAKE_CXX_SOURCE_FILE_EXTENSIONS jso)
然后,我将扩展名为“.jso”的对象文件添加到 CMake 源中,以包含在静态库目标中。
最后,我通过设置来破解编译器CC=mycc
, where mycc
是一个Python脚本,它检查输入是否具有扩展名“.jso”:如果没有,它只是重新调用标准编译器;否则它将把输入复制到输出而不做任何改变,这样mycc -c input.jso -o output.jso.o
只是文件副本。
这并不漂亮,但它完美地获取了增量构建的所有依赖项。我不能假装它很漂亮,但按照 CMake 喜欢的方式做事似乎很有效。在这里,我们只是假装所有输入都是源文件,即使它们实际上已经编译过。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)