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

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

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

非常感谢您的任何建议,

4

3 回答 3

3

我试图测试我的解决方案,但您的 CMakeLists.txt 对我有用,没有任何更改。不过,看看这个问题: Include static lib in dynamic lib,看来您应该尝试

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

(滚动到最后,这是一条长线)

于 2013-10-04T00:29:16.723 回答
2

没那么简单。

您可以查看使用“-Wl,--whole-archive”或“-Wl,--export-all-symbols”,具体取决于您的平台,但没有很好的跨平台方式来执行此操作。一切都不同,Windows 使用 lib.exe 玩完全不同的游戏。

你可能想做这样的事情:

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

...并专门为您想要支持的平台添加支持,一次一个。

于 2013-10-04T04:06:02.277 回答
2
# 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。

这解决了我的问题。

于 2013-10-09T10:05:29.743 回答