【问题标题】:C/cmake - how to add a linker flag to an (unused) library when the library is specified in TARGET_LINK_LIBRARIES?C/cmake - 当在 TARGET_LINK_LIBRARIES 中指定库时,如何向(未使用的)库添加链接器标志?
【发布时间】:2013-07-02 11:06:33
【问题描述】:

在我的项目的根目录中,我有一个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)

my_libCMakelist.txt 中我有:

ADD_LIBRARY(MY_LIB
    my_lib.c
)
TARGET_LINK_LIBRARIES(MY_LIB)

my_appCMakelist.txt 中有:

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

如果MY_LIBCMakelist.txtCMakelist.txt 中的TARGET_LINK_LIBRARIES 中指定my_app,我只想使用这个标志(--whole-archive)。

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

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

SET_TARGET_PROPERTIES(MY_LIB PROPERTIES CMAKE_EXE_LINKER_FLAGS "-Wl,--whole-archive -lMY_LIB -Wl,--no-whole-archive")

但这不起作用。

我该怎么做?

【问题讨论】:

    标签: c linker cmake


    【解决方案1】:

    CMake 命令target_link_libraries 允许在链接给定目标时指定库和标志。不要在TARGET_LINK_LIBRARIES 调用中直接使用目标名称MY_LIB,而是使用一个变量,该变量使用--whole-archive--no-whole-archive 标志包装对MY_LIB 的引用:

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

    【讨论】:

      猜你喜欢
      • 2014-08-23
      • 2021-01-02
      • 1970-01-01
      • 2011-07-20
      • 2015-08-16
      • 2016-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多