在我的项目的根目录中,我有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
但这不起作用。
我该怎么做?
答案 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})