4

我一直在尝试在 CMake 中包含不同类型的库。

  • 。一个
  • .dylib
  • 。所以

我终于得到了.a.dylib使用这段代码。

find_library(libname NAMES  libcef.dylib PATHS ${libname_PATH})

除此之外,在我add_executable为构建初始化所有文件的地方。

target_link_libraries(${PROJECT_NAME} ${libname})

但是,我尝试在文件上使用相同的代码.so,但它似乎不起作用。

当我尝试构建时,我从 cmake 得到了这个声明。

Target "project name" links to item

-- path of file -- 

which is a full-path but not a valid library file name.

我不确定这是否是处理.so文件的正确方法,或者我什至不完全理解.so文件是什么。任何输入和/或澄清将不胜感激。

编辑:

理论 - 我的理论是因为它在库名称前面没有 lib,它被称为 ffmpegsumo.so。但是,当我尝试重命名它时,文件名仍然保存到变量名中,这很奇怪。

4

2 回答 2

1

这同样适用于 .so 文件,只需确保所需的 .so 文件存在于 ${libname_PATH}您提供的位置。

find_library 以相同的方式处理所有类型 (.a / .so/ .dylib/ .dll)。问题可能如下

-- 路径设置不正确
-- 绝对路径错误
-- .so 不存在
-- 如果错误来自构建(而不是仅来自配置),.so 可能已损坏,请尝试替换它

--您的库似乎无效

于 2013-09-06T07:35:05.117 回答
0

共享库是动态链接的。这意味着您的操作系统将在运行应用程序时自动查找并加载 .so 文件。你只需要告诉 cmake 库的名字,剩下的交给操作系统。

例如,如果您想链接到 libSDL.so 的动态库,您只需说:target_link_libraries(${PROJECT_NAME} SDL)

作为健全性检查,您的链接器将确保 SDL 库确实存在于您的计算机上。这就是为什么如果该库在链接时不可用,即使它实际上是一个动态库,您可能会收到链接错误。

于 2013-09-05T23:10:28.420 回答