在我的项目的根目录中,我有一个子目录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.txt
的my_lib
,我有:
ADD_LIBRARY(MY_LIB
my_lib.c
)
TARGET_LINK_LIBRARIES(MY_LIB)
Run Code Online (Sandbox Code Playgroud)
在CMakelist.txt
的my_app
,我有:
ADD_EXECUTABLE(my_app my_app.c)
TARGET_LINK_LIBRARIES(my_app MY_LIB)
Run Code Online (Sandbox Code Playgroud)
我的问题是我只想使用这个标志(--whole-archive
)如果MY_LIB
在TARGET_LINK_LIBRARIES
in 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.txt
in 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_LIB
在TARGET_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)