如何使用cmake生成基于静态库的动态链接库
2个回答
展开全部
在工程搭建时,可能会有将静态库链接成动态库的需求,如出于代码保护的角度,某些模块会发布.a扩展名的静态库,我们要将多个这样的静态库链接成一个动态
库。但与直接link目标文件不同的是,ld以默认参数执行时,并把静态库中没有用到的函数过滤掉,导致生成的so并未包含所要的函数,因此要加上
--whole-archive参数,以保证所有的函数都包含在生成的so中。
在使用cmake时,CMakeLists.txt的写法如下:
add_library(
${MODULE_NAME}
SHARED
${CMAKE_SOURCE_DIR}/builttime.c #要生成一个so,至少要包含一个源文件,实在没有可以把库的编译时间戳打到这儿。
)
target_link_libraries(
${MODULE_NAME}
${${MODULE_NAME}_EXTRA_LDFLAGS}
"-Wl,--whole-archive" #告诉编译器,从这里开始,所有的库的内容都包含到so中
${LOCAL_MODULES} #可以是以源代码生成的静态库
${PREBUILT_MODULES} #可以是预先生成的静态库
"-Wl,--no-whole-archive" #告诉编译器,从这里开始,以后的库的内容不用都包含到so中
)
库。但与直接link目标文件不同的是,ld以默认参数执行时,并把静态库中没有用到的函数过滤掉,导致生成的so并未包含所要的函数,因此要加上
--whole-archive参数,以保证所有的函数都包含在生成的so中。
在使用cmake时,CMakeLists.txt的写法如下:
add_library(
${MODULE_NAME}
SHARED
${CMAKE_SOURCE_DIR}/builttime.c #要生成一个so,至少要包含一个源文件,实在没有可以把库的编译时间戳打到这儿。
)
target_link_libraries(
${MODULE_NAME}
${${MODULE_NAME}_EXTRA_LDFLAGS}
"-Wl,--whole-archive" #告诉编译器,从这里开始,所有的库的内容都包含到so中
${LOCAL_MODULES} #可以是以源代码生成的静态库
${PREBUILT_MODULES} #可以是预先生成的静态库
"-Wl,--no-whole-archive" #告诉编译器,从这里开始,以后的库的内容不用都包含到so中
)
Storm代理
2023-07-25 广告
2023-07-25 广告
StormProxies是一家提供动态代理服务器服务的企业,旨在帮助用户更好地管理网络访问和安全。以下是一些关于StormProxies的IP动态代理服务的特点:1. 高匿名性:StormProxies的动态代理服务器具有高匿名性,可以有效...
点击进入详情页
本回答由Storm代理提供
推荐于2016-08-14 · 知道合伙人数码行家
可以叫我表哥
知道合伙人数码行家
向TA提问 私信TA
知道合伙人数码行家
采纳数:25897
获赞数:1464981
2010年毕业于北京化工大学北方学院计算机科学与技术专业毕业,学士学位,工程电子技术行业4年从业经验。
向TA提问 私信TA
关注
展开全部
在工程搭建时,可能会有将静态库链接成动态库的需求,如出于代码保护的角度,某些模块会发布.a扩展名的静态库,我们要将多个这样的静态库链接成一个动态库。但与直接link目标文件不同的是,ld以默认参数执行时,并把静态库中没有用到的函数过滤掉,导致生成的so并未包含所要的函数,因此要加上--whole-archive参数,以保证所有的函数都包含在生成的so中。
在使用cmake时,CMakeLists.txt的写法如下:
add_library(
${MODULE_NAME}
SHARED
${CMAKE_SOURCE_DIR}/builttime.c #要生成一个so,至少要包含一个源文件,实在没有可以把库的编译时间戳打到这儿。
)
target_link_libraries(
${MODULE_NAME}
${${MODULE_NAME}_EXTRA_LDFLAGS}
"-Wl,--whole-archive" #告诉编译器,从这里开始,所有的库的内容都包含到so中
${LOCAL_MODULES} #可以是以源代码生成的静态库
${PREBUILT_MODULES} #可以是预先生成的静态库
"-Wl,--no-whole-archive" #告诉编译器,从这里开始,以后的库的内容不用都包含到so中
)
在使用cmake时,CMakeLists.txt的写法如下:
add_library(
${MODULE_NAME}
SHARED
${CMAKE_SOURCE_DIR}/builttime.c #要生成一个so,至少要包含一个源文件,实在没有可以把库的编译时间戳打到这儿。
)
target_link_libraries(
${MODULE_NAME}
${${MODULE_NAME}_EXTRA_LDFLAGS}
"-Wl,--whole-archive" #告诉编译器,从这里开始,所有的库的内容都包含到so中
${LOCAL_MODULES} #可以是以源代码生成的静态库
${PREBUILT_MODULES} #可以是预先生成的静态库
"-Wl,--no-whole-archive" #告诉编译器,从这里开始,以后的库的内容不用都包含到so中
)
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询