繁体   English   中英

使用CMake将共享库与静态链接起来

[英]linking a shared library with statics using CMake

cmake 2.8
gcc (GCC) 4.8.1

编辑----------

whole-archive的静态库包装为除了pjmedia-videodev之外的每个库都有问题现在的问题是,当我尝试构建时,我得到以下错误。

cbar_factory_init': colorbar_dev.c:(.text+0x2a0): undefined reference to pjmedia_format_init_video'

你好,

我创建了一个共享库,我需要将该库与大约10个静态库链接起来。 然后,我将可执行文件与共享库链接起来。

我的问题是,当我运行make时,它无法链接,因为它也需要静态库。 目的是为静态库创建一个包装器。 因此,可执行文件只需链接1个单独的共享库。 当我将共享库与静态链接时,静态将自动成为共享库源代码的一部分。

只有代码sippnet才能缩短它。 在我的CMakeLists.txt中创建共享库并链接静态库:

add_library(app_module_sip SHARED app_module_sip_init.c)

 set(PJSIP_LIBRARIES
  g7221codec
  gsmcodec
  ilbccodec
  milenage
  pj
  pjlib-util
  pjmedia
  pjmedia-codec
  pjmedia-audiodev
  pjmedia-videodev
  pjnath
  pjsip
  pjsip-simple
  pjsip-ua
  pjsua
  portaudio
  resample
  speex
  srtp
)

target_link_libraries(app_module_sip pthread m uuid nsl rt asound crypto ssl ${PJSIP_LIBRARIES})

现在我的CMakeLists.txt生成可执行文件

add_executable(app sip_test.c)

target_link_libraries(app app_module_sip)

这是正确的我在这里做什么。 我不想将可执行文件与静态库链接。 只是单个共享库,因为那是我的包装器,我将调用其中的函数。

它确实链接好,如果我在制作可执行文件时链接所有静态库,但这不是我想要的结果。

非常感谢任何建议,

我试着测试我的解决方案,但是你的CMakeLists.txt没有任何改动。 不过,看看这个问题: 在动态库中包含静态库 ,看起来你应该试试

target_link_libraries(app_module_sip ... ssl -Wl,-whole-archive ${PJSIP_LIBRARIES} -Wl,-no_whole-archive)

(滚动到最后,这是一个很长的行)

这不是那么简单。

您可以根据您的平台使用'-Wl, - whole-archive'或'-Wl, - export-all-symbols'来查看,但是没有良好的跨平台方式。 一切都做得与众不同,Windows使用lib.exe播放完全不同的游戏。

你可能想做这样的事情:

http://www.mail-archive.com/cmake@cmake.org/msg01890.html

...并且一次添加一个专门针对您要支持的平台的支持。

# Location for shared library
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/libs)

# Create shared library
add_library(app_module_sip SHARED app_module_sip_init.c)

# compile and link for 32 bit mode
set_target_properties(app_module_sip PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32")

# PJSIP static libraries
set(PJSIP_LIBRARIES
  pjsua
  pjsip-ua
  pjsip-simple
  pjsip
  pjmedia-codec
  pjmedia-videodev
  pjmedia
  pjmedia-audiodev
  pjnath
  pjlib-util
  resample
  milenage
  srtp
  gsmcodec
  speex
  ilbccodec
  g7221codec
  portaudio  
  pj
)

# Wrap the static libraries in to the shared library
target_link_libraries(app_module_sip -Wl,--start-group ${PJSIP_LIBRARIES} -Wl,--end-group 
  m uuid nsl rt pthread asound crypto ssl)

需要包装pjsip库的是以下链接器命令-Wl, - start-group * .a -Wl, - end-group。

这解决了我的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM