将可执行文件链接到第三方依赖共享库时,C++ CMake 未定义引用

2023-12-02

我读了很多相关主题(例如1, 2, 3)但我自己没有找到答案,所以我在这里。

我有一个可构建且可执行的 CMake 项目,假设为“x”。我创建了一个名为“a.so”的共享库,它依赖于另一个名为“b.so”的共享库。我想在“x”中使用“a”。

这是我简化的“x”CMakelists.txt:

SET(ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR})

LINK_DIRECTORIES(${ROOT_DIR}/lib/a/bin/) # contains liba.so

INCLUDE_DIRECTORIES(${ROOT_DIR}/lib/a/include/) # contains "a" headers

ADD_EXECUTABLE(x ${SOURCE})

TARGET_LINK_LIBRARIES(x a)

“x”编译输出摘录:

Linking CXX executable ../bin/x
/usr/bin/cmake -E cmake_link_script CMakeFiles/x.dir/link.txt --verbose=1
/usr/lib64/ccache/c++   -std=c++0x    CMakeFiles/x.dir/src/main /Main.cpp.o 
 ... -L/.../lib/a/bin -rdynamic  -la  -Wl,-rpath,/.../lib/a/bin 

“a”和“b”确实可以编译。

问题是当我想编译 x 时,链接时出现错误:对“函数名称”的未定义引用。我也尝试链接到“b”,但它仍然不起作用.

这里也出现了“b”,但我得到了同样的错误......

Linking CXX executable ../bin/x
/usr/bin/cmake -E cmake_link_script CMakeFiles/x.dir/link.txt --verbose=1 
/usr/lib64/ccache/c++   -std=c++0x    CMakeFiles/x.dir/src/main 
/Main.cpp.o -o ../bin/x  -L/.../lib/b/bin -L/.../lib/a/bin 
-rdynamic -lb -la -Wl,-rpath,/.../lib/b/bin:/.../lib/a/bin 

这是错误输出:

 $ make
 [ 20%] Automatic moc for target x
 Linking CXX executable ../bin/x
 /.../lib/b/bin/b.so: undefined reference to `snd_pcm_sw_params_set_start_threshold'
 /.../lib/b/bin/b.so: undefined reference to `snd_seq_delete_simple_port'
 /.../lib/b/bin/b.so: undefined reference to `snd_pcm_info_set_device'
 /.../lib/b/bin/b.so: undefined reference to `snd_pcm_sw_params'
 /.../lib/b/bin/b.so: undefined reference to `snd_pcm_sw_params_set_silence_threshold'
 /.../lib/b/bin/b.so: undefined reference to `snd_pcm_hw_params_any'
 /.../lib/b/bin/b.so: undefined reference to `snd_seq_drain_output'
 /.../lib/b/bin/b.so: undefined reference to `snd_ctl_pcm_next_device'

 ...

 collect2: error: ld returned 1 exit status
 CMakeFiles/x.dir/build.make:163: recipe for target '../bin/x' failed
 make[2]: *** [../bin/x] Error 1
 CMakeFiles/Makefile2:60: recipe for target 'CMakeFiles/x.dir/all' failed
 make[1]: *** [CMakeFiles/x.dir/all] Error 2
 Makefile:76: recipe for target 'all' failed
 make: *** [all] Error 2

我不明白出了什么问题,我现在很困惑,因为我尝试了很多方法来使事情正常工作......但没有任何效果。

任何想法?

Thanks!


我在上面的评论中向您询问了错误输出,因为它可以帮助搜索未定义的符号/引用.

所以,看来你的 b.so 找不到 ALSA 库。如果你使用CMake 3.0(及以上)您可以将其添加到您的CMakeLists.txt via

find_package( ALSA )

并且可以附加${ALSA_INCLUDE_DIR}到你的包含路径和${ALSA_LIBRARY}到您的链接器路径。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将可执行文件链接到第三方依赖共享库时,C++ CMake 未定义引用 的相关文章

随机推荐

  • Delphi 中的库项目是否有条件定义?

    我有一个实用程序单元 其中的代码在一些应用程序和 DLL 之间共享 我想根据当前项目类型有选择地编译本单元的部分内容 应用程序 包或库 我在中找不到库或包的任何条件定义System单位 Google 没有找到任何相关内容 那么 是否有任何条
  • 删除行后释放 postgres 数据库中的存储空间的步骤?

    我超过了 Heroku 上 postgres 数据库的 GB 限制 我找到了一个 非常大的 已弃用的表并运行Plot delete all 现在 17k 行表中有 0 行 我现在可以看到行号有差异 但 GB 没有差异 这是之前的数据大小 3
  • 将 NSPredicate 应用于 [(String, Array)]

    我以这种方式存储数据 var data String Array
  • Javascript 中两个日期初始化的差异

    为什么要做这些两个日期不同 var date1 new Date date1 setFullYear 2012 year four digits date1 setMonth 10 month from 0 11 date1 setDate
  • C++ 回调将文本发送回 C#

    我是 C 新手 我被告知使用 C 的 回调 是最好的解决方案 这是我的情况 我有一个用 C 编写的 DLL这个 DLL 有一个方法来启动通过 C 代码运行的服务 这工作正常 当 DLL 中的服务运行时 我希望 DLL 将文本传递回 C 代码
  • 无法解析:com.google.firebase:firebase-analytics:9.0.0 [重复]

    这个问题在这里已经有答案了 根据Google I O 2016 我知道 Firebase 它对我来说非常好 但我无法使用它 因为这个错误 我得到了一个解决方案 将 Google play services 更新到30 但没有更新尖端 您必须
  • 如何将设备函数中分配的内存复制回主内存

    我有一个包含主机函数和设备函数的 CUDA 程序执行 在主机函数中 我分配了一个全局内存output然后它将被传递给设备函数并用于存储设备函数内分配的全局内存的地址 我想访问主机函数中内核分配的内存 以下是代码 include
  • 循环遍历图像目录并将它们旋转 x 度并保存到目录

    我正在使用 Python Open Numpy 和 Scipy 我有一个图像目录 我想将其旋转一定角度 我想编写这个脚本 我正在用这个 OpenCV Python 将图像围绕特定点旋转 X 度但它似乎并不完全按照我的设想进行 我得到了指定的
  • 多个元素的 jQuery UI 自动完成格式

    我的 jQuery UI 自动完成设置符合我的喜好并且工作完美 但有一个致命的缺陷 在我的自动完成中 我使用自定义显示就像这个例子 我有一些非常相似的东西 但有一个例外 唯一的区别是我在该页面上有多个同一类的自动完成元素 只有第一个元素显示
  • 转换为 Dalvik 格式失败,错误 2 adt 16.0.1

    最近我们将 eclipse adt 插件更新到了 16 版本 现在无法运行我们的应用程序 它可以正常编译 但是当我们运行时 它会抛出以下错误 写入输出时遇到问题 016be7fe 0032 没有扩展操作码 sget object v4 Lo
  • 当你可以用 <<< 和结束分隔符填充字符串时,它被称为什么?

    我知道在 C 和 PHP 中 您可以用硬编码文本填充字符串或文件 如果我没记错的话 它应该是这样的 var lt lt lt DELIMITER Menu for program X 1 Add two numbers 2 Substrac
  • 计算带有空白的唯一值Excel公式

    我正在尝试使用公式计算 Excel 中的唯一值 我尝试使用下面的公式 但它返回 DIV 0 错误 因为我的范围中有空格 无论如何 是否可以使用公式来计算带有空白的范围内的唯一值 任何有关此问题的帮助将不胜感激 SUM 1 COUNTIF U
  • 在 Linux C++ 上检测 keydown 和 keyup 事件 [重复]

    这个问题在这里已经有答案了 可能的重复 访问 C 中的击键 监控 Ubuntu 中的键盘按键 我想检测程序中的每个 keydown 和 keyup 事件并为其添加时间戳 是的 我的意思是keydown and keyup不仅仅是按键 以及按
  • 在data.table中动态创建新列

    我在 R 中有一个 data table 想要创建一个新列 假设我将日期列名称保存为变量并想要附加 year到新列中的该名称 我可以通过指定名称来完成正常的路由 但是如何使用date col多变的 这是我尝试过的 我想要的最后两个不起作用
  • Spark - 将整行传递给 udf,然后获取 udf 内的列名称

    我正在将 Spark 与 Scala 一起使用 并且希望将整行传递给 udf 并选择 side udf 中的每个列名称和列值 我怎样才能做到这一点 我正在尝试遵循 inputDataDF withColumn errorField mapC
  • 在 UCS-2 Little Endian、Java 中写入文本文件

    我正在尝试写入 txt 文件 它必须是 UCS 2 Little Endian 但是当我尝试时 writer new PrintWriter path UTF 16LE 从我读到的内容来看 它应该是相同的 但它在服务器上的特定应用程序中不起
  • 如何在 Zxing 扫描仪相机视图中添加按钮?

    我当前的 Zxing 扫描仪屏幕如下所示 我想在上面添加一个文本视图和几个按钮 我尝试了很多程序 但没有任何效果 任何人都可以指导我 我将虚心期待您的帮助 这是代码 Java文件 private ZXingScannerView mScan
  • 在 Gradle 和 Eclipse 的 Checkstyle-plugins 中使用 ${samedir}

    I use a 抑制滤波器在我的 checkstyle 配置中 文件的路径suppression xml相对于 checkstyle configuration 给出 使用 samedir http eclipse cs sourcefor
  • 从列表列表中删除 NULL 元素

    如何从 R 中的列表列表中删除 null 元素 如下所示 lll lt list list NULL list 1 list a 我想要的对象看起来像 lll lt list list 1 list a 我在这里看到了类似的答案 如何从列表
  • 将可执行文件链接到第三方依赖共享库时,C++ CMake 未定义引用

    我读了很多相关主题 例如1 2 3 但我自己没有找到答案 所以我在这里 我有一个可构建且可执行的 CMake 项目 假设为 x 我创建了一个名为 a so 的共享库 它依赖于另一个名为 b so 的共享库 我想在 x 中使用 a 这是我简化