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

时间:2013-07-04 12:29:20

标签: c linker cmake

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

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

它有效!

在根目录的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)

CMakelist.txt my_lib我有:

ADD_LIBRARY(MY_LIB
    my_lib.c
)
TARGET_LINK_LIBRARIES(MY_LIB)

CMakelist.txt my_app我有:

ADD_EXECUTABLE(my_app my_app.c)
TARGET_LINK_LIBRARIES(my_app MY_LIB)

我的问题是,如果在--whole-archive MY_LIB的{​​{1}}中指定TARGET_LINK_LIBRARIES,我只想使用此标记(CMakelist.txt)。

如果最后一行my_app不存在,我不想在TARGET_LINK_LIBRARIES(my_app MY_LIB)中添加"-Wl,--whole-archive -lMY_LIB -Wl,--no-whole-archive"

我尝试从root中的CMakelist.txt中删除此标记,并将以下内容添加到CMAKE_EXE_LINKER_FLAGS子目录中的CMakelist.txt

my_lib

但这不起作用。

我该怎么做?

1 个答案:

答案 0 :(得分:13)

CMake命令target_link_libraries允许在链接给定目标时指定库和标志。不要在MY_LIB调用中直接使用目标名称TARGET_LINK_LIBRARIES,而是使用包含MY_LIB--whole-archive标记的--no-whole-archive引用的变量:< / p>

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})