C/cmake - 在TARGET_LINK_LIBRARIES中指定库时,如何向(未使用的)库添加链接器标志?

Lil*_*lás 5 c linker cmake

在我的项目的根目录中,我有一个子目录my_lib和另一个子目录my_app.该库my_lib定义了填充链接器定义的节的表,这些表不是直接使用的my_app,因此该库未链接.

为了强制my_lib被链接,我添加了标志--whole-archive,如下所述.

它的工作原理!

在根目录的CMakelist.txt中,我有以下内容:

SET(CMAKE_EXE_LINKER_FLAGS "-mmcu=cc430f6137 -Wl,--gc-sections -Wl,--whole-archive -lMY_LIB -Wl,--no-whole-archive")
ADD_SUBDIRECTORY(my_lib)
Run Code Online (Sandbox Code Playgroud)

CMakelist.txtmy_lib,我有:

ADD_LIBRARY(MY_LIB
    my_lib.c
)
TARGET_LINK_LIBRARIES(MY_LIB)
Run Code Online (Sandbox Code Playgroud)

CMakelist.txtmy_app,我有:

ADD_EXECUTABLE(my_app my_app.c)
TARGET_LINK_LIBRARIES(my_app MY_LIB)
Run Code Online (Sandbox Code Playgroud)

我的问题是我只想使用这个标志(--whole-archive)如果MY_LIBTARGET_LINK_LIBRARIESin CMakelist.txt中指定my_app.

如果最后一行TARGET_LINK_LIBRARIES(my_app MY_LIB)是不存在的,我不希望添加"-Wl,--whole-archive -lMY_LIB -Wl,--no-whole-archive"CMAKE_EXE_LINKER_FLAGS.

我试图从root中的CMakelist.txt中删除此标志,并将以下内容添加到CMakelist.txtin my_lib子目录中:

SET_TARGET_PROPERTIES(MY_LIB PROPERTIES CMAKE_EXE_LINKER_FLAGS "-Wl,--whole-archive -lMY_LIB -Wl,--no-whole-archive")
Run Code Online (Sandbox Code Playgroud)

但这不起作用.

我怎样才能做到这一点?

sak*_*kra 13

CMake命令target_link_libraries允许在链接给定目标时指定库和标志.而不是直接使用目标的名字MY_LIBTARGET_LINK_LIBRARIES通话,使用该包装的参考变量MY_LIB--whole-archive--no-whole-archive标志:

ADD_LIBRARY(MY_LIB
    my_lib.c
)
SET(MY_LIB_LINK_LIBRARIES -Wl,--whole-archive MY_LIB -Wl,--no-whole-archive)
...
ADD_EXECUTABLE(my_app my_app.c)
TARGET_LINK_LIBRARIES(my_app ${MY_LIB_LINK_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)