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)
这是正确的我在这里做的事情。我不想将可执行文件与静态库链接。只是单个共享库,因为那是我的包装器,我将在其中调用函数。
如果在制作可执行文件时链接所有静态库,它确实链接正常,但这不是我想要的结果。
非常感谢任何建议,
答案 0 :(得分: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)
(滚动到最后,这是一条长行)
答案 1 :(得分:2)
这不是那么简单。
您可以根据您的平台使用'-Wl, - whole-archive'或'-Wl, - export-all-symbols'来查看,但没有良好的跨平台方式。一切都做得与众不同,Windows使用lib.exe播放完全不同的游戏。
你可能想做这样的事情:
http://www.mail-archive.com/cmake@cmake.org/msg01890.html
...并且一次添加一个专门针对您要支持的平台的支持。
答案 2 :(得分:1)
# 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。
这解决了我的问题。