5

由于多种原因,我必须通过自定义命令手动生成静态库。

但是,似乎只有在目标明确请求其输出文件时才执行自定义命令。

如果我尝试将生成的静态库与 链接target_link_libraries,CMake 会抱怨它找不到生成它的规则。

# Building library on the fly
add_custom_command(OUTPUT mylib.a
    COMMAND ...
)
add_executable(myexe main.cpp)                                                                                                                                                     
target_link_libraries(myexe mylib.a) # Fails miserably

add_custom_command我想我必须以某种方式在调用和调用之间插入一个目标或依赖项target_link_libraries,但我不明白如何正确地这样做。

4

2 回答 2

1

为了保留可执行文件和库文件之间的依赖关系,您需要在链接时使用库文件的完整路径

target_link_libraries(my_exe ${CMAKE_CURRENT_BINARY_DIR}/mylib.a)

使用相对路径时,CMake 期望链接器找到库(根据其规则),因此在这种情况下,CMake 无法调整与库文件的依赖关系。

于 2017-05-20T09:47:25.860 回答
0

我必须这样做才能调用 MATLAB 的 RTW 来为我构建 DLL。我使用的功能是add_custom_target.

add_custom_target(Name [ALL] [command1 [args1...]]
                  [COMMAND command2 [args2...] ...]
                  [DEPENDS depend depend depend ... ]
                  [BYPRODUCTS [files...]]
                  [WORKING_DIRECTORY dir]
                  [COMMENT comment]
                  [VERBATIM] [USES_TERMINAL]
                  [COMMAND_EXPAND_LISTS]
                  [SOURCES src1 [src2...]])

对你来说,它可能看起来像这样:

add_custom_target(MyLib ALL 
                  <Put your command here>
                  COMMENT "Building MyLib"
                  )
add_executable(MyExe main.cpp)
target_link_libraries(MyExe MyLib)

如果这不起作用,我听说您可以使用它add_library()来创建一个虚拟库。然后,使用set_target_properties()为它创建一个 INTERFACE 属性。

参考:

add_custom_target

于 2017-05-23T20:25:47.773 回答