相关疑难解决方法(0)

共享库的CMake和顺序依赖链接

我有几个小组件,我正在构建为我的主应用程序的共享库.允许使用的一个例子libalibb.每个都在它们自己的子目录中构建,如下所示:

add_library(liba SHARED a.cpp)
Run Code Online (Sandbox Code Playgroud)

然后,在根项目文件夹中,我需要将我的主应用程序链接到两者.

include_directories(a)
include_directories(b)
add_executable(dummy dummy.cpp)
target_link_libraries(dummy a b)
Run Code Online (Sandbox Code Playgroud)

CMake运行正常,我的应用程序编译但无法链接.问题是b引用了a.如果我在链接时提供库的顺序

target_link_libraries(dummy b a)
Run Code Online (Sandbox Code Playgroud)

该程序编译和链接就好了

当这种系统开始涉及更复杂的库之间的依赖关系时,即使依赖关系是非循环的,它也开始变得不可能.如何在此管理链接步骤?在CMake中订购库以进行链接是否有诀窍?

c++ cmake dynamic-linking

31
推荐指数
2
解决办法
2万
查看次数

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

cmake 2.8
gcc (GCC) 4.8.1
Run Code Online (Sandbox Code Playgroud)

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

将静态库包装到whole-archive每个库的工作中除了pjmedia-videodev现在的问题是当我尝试构建时,我得到以下错误.

cbar_factory_init': colorbar_dev.c:(.text+0x2a0): undefined reference to pjmedia_format_init_video'
Run Code Online (Sandbox Code Playgroud)

你好,

我创建了一个共享库,我需要将该库与大约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})
Run Code Online (Sandbox Code Playgroud)

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

add_executable(app sip_test.c)

target_link_libraries(app app_module_sip)
Run Code Online (Sandbox Code Playgroud)

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

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

非常感谢任何建议,

c cmake ld pjsip

5
推荐指数
1
解决办法
8363
查看次数

标签 统计

cmake ×2

c ×1

c++ ×1

dynamic-linking ×1

ld ×1

pjsip ×1